[英]Managing InterruptedException
我已閱讀http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html
我決定通過以下方式使我的鎖定不可取消任務
try {
lockedRecords.wait();
} catch (InterruptedException e) {
interrupted = true;
}
但是有沒有必要
} finally {
if (interrupted) {
Thread.currentThread().interrupt();
}
}
文章說你應該調用 interrupt() 來保持中斷狀態。 我還是很模糊,那么如果我 set.interrupt 呢? 接下來發生什么? 對此有點迷失......任何輸入?
它給我的程序帶來什么價值? 請用外行的方式解釋,不勝感激:D
這里重要的是示例中未編寫的代碼。 示例中的方法 ( 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
中那樣重置,但是當有人試圖在線程處於 queue.take 中時中斷線程時queue.take
,那么中斷就會丟失,我上面寫的getNextTask
代碼將永遠不會停止循環。
IBM 網頁上示例的全部要點是,在吞下中斷時必須非常小心,因為它可能會意外地使線程無法中斷。
只要您知道當前線程將在您的任務完成並返回后終止,只需吞下InterruptedException
就可以了。
使用某些線程池時可能會出現問題,例如ExecutorService
,通常線程在任務完成后繼續運行,等待下一個任務的到來。 在這種情況下,應該通知池線程它已被中斷,以便它可以在這種情況下執行任何適當的操作,例如執行干凈的關閉和退出。
因此,在從例行程序返回之前,確保恢復中斷的 state 是一種很好的做法,而且更安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.