簡體   English   中英

管理中斷異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM