2011-08-09 33 views
0

我已閱讀http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html管理InterruptedException的

我決定通過

try { 
    lockedRecords.wait(); 
} catch (InterruptedException e) { 
    interrupted = true; 
} 

,使我的鎖uncancelable任務,但有必要

} finally { 
    if (interrupted) { 
     Thread.currentThread().interrupt(); 
    } 
} 

文章說,你應該調用中斷()來保持中斷狀態。我仍然很模糊,所以如果我設置.interrupt?接下來發生什麼?有點丟失在這..任何輸入?

它給我的程序帶來了什麼價值?請非常感謝:D

+0

本文可能會幫助您理解這種機制以及如何處理它:[您如何處理InterruptedException?](http://www.yegor256.com/2015/10/20/interrupted-exception.html ) – yegor256

回答

2

這裏重要的是代碼中沒有寫的例子。 在示例(getNextTask)所述方法可用於:

while (!Thread.interrupted()) { 
    Task task = getNextTask(queue); 
    doSomething(task); 
} 
System.out.println("The thread was interrupted while processing tasks."); 
System.out.println("...stopped processing."); 

while循環以上永遠執行,除非有人中斷的線程在其上這個循環運行。

如果中斷狀態不會被重置爲在getNextTask然而,當有人試圖中斷線程當線程處於getNextTaskqueue.take,那麼中斷丟失完成,代碼我上面寫的位將永遠不會停止循環。

IBM網頁上的示例的要點在於,當您吞下中斷時您必須非常小心,因爲它可能會意外地使線程無法中斷。

+0

oic但如果在應用程序中沒有停止中斷的代碼,我們不應該擔心它嗎? – seesee

+0

嗯,是的......但最好還是設置中斷,因爲在某些時候你可能會重複使用你的代碼,並且很難弄清楚爲什麼某些線程不能被中斷。 – toto2

0

只要吞下InterruptedException就可以了,只要您知道當前線程將在任務完成並返回後終止。

使用線程池時可能會出現問題,如ExecutorService,通常線程在任務完成後繼續運行,等待下一個任務的到來。在這種情況下,彙集的線程應該被通知它被中斷,以便在這種情況下它可以做任何適當的事情,例如,執行乾淨關閉並退出。

因此,確保在從例程返回之前恢復中斷狀態是一種很好的做法並且更安全。