2011-12-28 68 views
0

請向我解釋爲什麼下面的代碼拋出IllegalThreadStateException?爲什麼要做Thread.interrupt()拋出IllegalThreadStateException?

try 
{ 
    if(thread1 != null) 
    { 
     if(thread1.isAlive()); 
     { 
      thread1.interrupt(); //it is ok 
      thread1.join(); 
     } 
    } 
    if(thread2 != null) 
    { 
     if(thread2.isAlive()); 
     { 
      thread2.interrupt(); //throw IllegalThreadStateException 
      thread2.join(); 
     } 
    } 
} 
catch(IllegalThreadStateException e) 
{ 
    System.exit(0); 
} 

它在運行語句thread2.interrupt()時拋出IllegalThreadStateException。但是thread1.interrupt()是可以的。

請向我解釋。

非常感謝!

+0

什麼是異常消息? – SLaks 2011-12-28 01:54:09

+0

來自e.toString()的消息僅爲「java.lang.IllegalThreadStateException」 – Levanphong7887 2011-12-28 02:00:36

+0

e.toString()不是消息。檢查'getMessage()'或'printStackTrace()'。 – SLaks 2011-12-28 02:06:05

回答

0

行:

if(thread2.isAlive()); // <-- Note this semicolon well! 

不是做你覺得它在做什麼:-)代碼段:

if(thread2.isAlive()); 
{ 
    thread2.interrupt(); //throw IllegalThreadStateException 
    thread2.join(); 
} 

將檢查如果線程是活的,如果是這樣,執行該分號前的空語句。然後它會執行interrupt/join序列內的大括號,而不管線程的狀態如何。這是因爲:

{ 
    doSomething(); 
} 

是一個完全有效的Java結構,即使沒有ifwhile它前面。變化:

if(thread2.isAlive()); 

到:

if(thread2.isAlive()) 

(併爲thread1檢查一樣好)。


而且你還要叫getMessage()異常,找出具體的細節,如果有的話。

它可能包含更多信息,以便於根本原因分析。

+0

這是100%真實的,但它不會幫助。 – SLaks 2011-12-28 02:20:21

+0

@paxdiablo:OMG,我看到:)),非常感謝你! – Levanphong7887 2011-12-28 02:37:20

+0

我們可以從您的評論@Levanphong7887中推測出問題出在我們的想法嗎?你應該回顧你的舊答案,並開始接受那些最能解答你的問題的答案。你很可能會以這種方式對未來的問題做出更多的迴應。 – paxdiablo 2011-12-28 02:40:20

相關問題