Java 确定线程是否处于睡眠状态

Java 确定线程是否处于睡眠状态,java,multithreading,Java,Multithreading,我想知道我怎么知道一根线是否在睡觉。 我四处搜索,收集了一些信息,从这些信息中我写了一个方法isSleeping():boolean,我想我可以把它放在一个类中,以确定线程是否处于睡眠状态。我只是想知道我可能错过了什么。注意:我没有0天的经验 //isSleeping returns true if this thread is sleeping and false otherwise. public boolean isSleeping(){ boolean state = false

我想知道我怎么知道一根线是否在睡觉。 我四处搜索,收集了一些信息,从这些信息中我写了一个方法isSleeping():boolean,我想我可以把它放在一个类中,以确定线程是否处于睡眠状态。我只是想知道我可能错过了什么。注意:我没有0天的经验

//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;
}

您可以检查是否有
TIMED\u WAITING
状态。如果使用这种方法,应注意确保您没有刚刚调用
对象#wait

我有这个想法,我没有检查,但我认为它会起作用:

您可以扩展线程并覆盖睡眠以切换状态。 大概是这样的:

 @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;
}
那么你只需要一个标记和一个getter就可以了

public static boolean SLEEPMARKER = false;
public static boolean isSleeping(){
   return SLEEPMARKER;
}
更改“睡眠”->“睡眠”。除此之外,您不应该对此执行stacktrace,您的方法应该接受线程参数。考虑这个

    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

所以这在你没有创建的线程上不起作用。。。包括主干道。我不知道在启动时改变JVM以使用它并通过它路由所有线程创建有多容易。此外,在中断时,您将永远处于睡眠状态。这比我的解决方案要好。你只需要为非睡眠状态做好准备。它把ArrayIndex从BoundsPerception中抛了出去,只是为了证明OP的想法是有效的