2012-03-07 98 views
0

我想創建一個解決方案來處理由於內存泄漏,我們的應用程序中鎖定的資源而導致的掛起線程。我遇到的主要問題之一是試圖模擬一個掛起的線程來處理它。任何消化?如何使Java線程掛起

這是我試過的,但它似乎並沒有完成這項工作。有什麼想法嗎?

class KillerThread extends Thread{ 

    public KillerThread() { 
     super(); 
    } 
    public KillerThread(String threadName) { 
     super(threadName); 
    } 
    public void run(){ 
     System.out.println("Start of KillerThread " + this.getName()); 
     if (System.currentTimeMillis() % 2L == 0){ 
      try { 
       sleep(Long.MAX_VALUE); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      for(;;); 
     } 
    } 
} 
+1

你檢查http://stackoverflow.com/questions/3203139/how-do-you-hang-a-thread-in-java-in-one-line – naresh 2012-03-07 11:35:38

+0

爲我工作。你怎麼開始線程? – adarshr 2012-03-07 11:35:39

+1

「鴻」是什麼意思?你的意思是,即使中斷()也不會做任何事情嗎? – 2012-03-07 11:42:48

回答

1

嘗試像while循環運行的睡眠:

while(true) { 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
+0

我的IDE給我一個警告消息'Thread.sleep在循環中調用? – ThreaT 2015-06-11 16:13:44

+0

哇,老答案!是的,一般睡在一個循環導致表現不佳。您的IDE(NetBeans)會對此提出警告。爲了這個問題,這可以被忽略。 – Terraego 2015-06-12 08:21:24

0

運行的線程,然後告訴它在一個不可阻擋的循環睡覺,是個不錯的主意,。但如果你想讓它等待另一個線程,。使一個以上的線程,並讓他們彼此等待,一個僵局,是一個掛鉤,。

0

足夠簡單,只需要創建一個私有成員

private Object lock = new Object(); 

然後用它來等待通知(即永遠不會發生,除非你使用反射...)

while (true) { 
    try { 
     synchronized (lock) { 
     lock.wait(); 
     } 
    } cath (InterruptedException e) { 
     /* ignore interruption */ 
    } 
} 

和你線程將掛在那裏,不間斷。

+0

'UninterruptedException'?當線程不間斷時拋出? ;-) – Jesper 2012-03-07 13:11:17

+0

大聲笑,是的,:)我希望這些天我會有不間斷的睡眠! – 2012-03-07 14:59:21

0

我知道你需要什麼,你正在通過停止執行程序線程來測試某些東西。嘗試是這樣的:

private void testKillingThread() { 
    Object kill = new Object(); 
    try { 
     synchronized (kill) { 
      kill.wait(); 
     } 
    } catch (Exception e) { 
     // Auto-generated catch block 
    } 
} 
+0

你需要使用'while(true){kill.wait(); }'以防止虛假的喚醒。請參閱:http://stackoverflow.com/a/3203164/257299 – kevinarpe 2015-10-16 02:08:49

+0

@kevinarpe但這是如何可能的,當它與同步安全 – GingerHead 2015-10-16 09:22:19

+0

好問題。虛假喚醒非常複雜(!)。設想一下傳統的POSIX信號,例如'SIGUSR1',(通過'kill'命令行工具)發送到您的進程。通過POSIX規則(AFAIK),內核將喚醒每個睡眠/等待線程並通知輸入信號。這是爲什麼如果等待條件滿足,程序員需要檢查謂詞(布爾情況)的經典案例。關於JVM +信號的參考:http://www.oracle.com/technetwork/java/javase/signals-139944.html – kevinarpe 2015-10-16 10:16:43

0

這裏有一個快速解決我使用的測試。只需要鎖定電話號碼new Hanger().hang()即可。

刪除日誌記錄,如果你不想看到它。你可以添加throws InterruptedException(但事實上,它永遠不會)掛起方法,所以你可以用new Hanger().hang()代替Thread.sleep()而不用修改你的代碼。

public class Hanger { 

    private final static Logger log = Logger.getLogger(Hanger.class); 
    private long started = 0; 
    private final int beat = 100; // ms 

    /** 
    * Hangs a thread for the indicated time 
    * @param millis the amount of time to hang the thread, in milliseconds 
    */ 
    public void hang(int millis) { 
     started = System.currentTimeMillis(); 
     log.debug("Hanging this thread for " + millis + " ms"); 
     while (hung() < millis) { 
      try { 
       Thread.sleep(beat); 
      } catch (InterruptedException e) { 
       log.debug("Still hanging, will release in " + (millis - hung()) + " ms."); 
      } 
     } 

     log.debug("Releasing thread again after " + hung() + " ms"); 
    } 

    private int hung() { 
     return (int)(System.currentTimeMillis() - started); 
    } 
}