2013-03-13 104 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