2013-03-13 124 views
6

我在想如何知道线程是否正在睡眠。 我搜索了周围,我收集了一些信息,形成这些信息我写了一个方法 isSleeping():布尔,我想我可以放在一个类,以确定线程是否睡觉或不。我只想知道我可能错过了什么。注意:我没有经验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; 
} 

回答

0

你可以检查,看看是否Thread#getState()TIMED_WAITING状态。如果使用这种方法,应注意确保你没有叫做Object#wait

0

我有这个想法,我没有检查,但我认为这是可行的:

可以延长线和覆盖睡眠切换的状态。 事情是这样的:

@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; 
} 
+0

所以这不会对你没有创建线程......包括主要工作。我不知道有足够多的东西可以轻松地改变JVM在启动时使用它,并通过它创建所有线程创建。此外,您将在中断时永久停留在睡眠状态。 – djechlin 2013-03-13 15:36:47

1

更改“睡眠” - >“睡眠”。另外你不应该在this上进行堆栈跟踪,你的方法应该接受一个Thread参数。考虑这个

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 
+0

这比我的解决方案更好。你只需要准备好非睡眠状态。它抛出ArrayIndexOutOfBoundsException – CsBalazsHungary 2013-03-13 15:44:26

+0

当然,这只是为了证明OP的想法起作用 – 2013-03-13 15:46:35