确定线程是否处于休眠状态

7

我想知道如何确定一个线程是否正在睡眠。 我搜索了一些信息,从这些信息中,我编写了一个方法isSleeping():boolean,我认为可以将其放在一个类中来确定线程是否正在睡眠。我只是想知道我可能错过了什么。注意:我没有经验,零天经验。

//isSleeping returns true if this thread is sleeping and false otherwise.
public boolean isSleeping(){
    boolean state = false;
    StackTraceElement[] threadsStackTrace = this.getStackTrace();

    if(threadsStackTrace.length==0){
        state = false;
    }
    if(threadsStackTrace[0].getClassName().equals("java.lang.Thread")&&
            threadsStackTrace[0].getMethodName().equals("Sleep")){
        state = true;
    }
    return state;
}
3个回答

2

将“Sleep”更改为“sleep”。此外,您不应在this上获取堆栈跟踪,您的方法应该接受一个线程参数。请考虑以下内容:

    Thread t = new Thread(new Runnable(){
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    t.start();
    Thread.sleep(100);
    if(t.getStackTrace()[0].getClassName().equals("java.lang.Thread")&&
            t.getStackTrace()[0].getMethodName().equals("sleep")){
        System.out.println("sleeping");
    }

输出

sleeping

这比我的解决方案更好。你只需要准备非睡眠状态。它会抛出ArrayIndexOutOfBoundsException异常。 - CsBalazsHungary
当然,这只是为了证明原帖的想法可行。 - Evgeniy Dorofeev

0
你可以检查Thread#getState()是否处于TIMED_WAITING状态。如果使用这种方法,应该注意确保你没有刚刚调用了Object#wait

0

我有一个想法,虽然我没有检查过,但我认为它会起作用:

您可以扩展线程并覆盖 sleep 方法以切换状态。就像这样:

 @Override
public static void sleep(long millis, int nanos)
throws InterruptedException {
   SLEEPMARKER = true;
   super.sleep(millis, nanos);
   SLEEPMARKER = false;
}

 @Override
public static void sleep(long millis)
throws InterruptedException {
   SLEEPMARKER = true;
   super.sleep(millis);
   SLEEPMARKER = false;
}

那么你只需要标记和一个获取器。

public static boolean SLEEPMARKER = false;
public static boolean isSleeping(){
   return SLEEPMARKER;
}

所以这个方法不能在你没有创建的线程上运行,包括主线程。我不知道要深入了解JVM并更改它以在启动时使用此方法并将所有线程创建路由通过它有多容易。此外,当中断发生时,你将永久地陷入睡眠状态。 - djechlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接