此問題來自Brian Goetz第7章7.1.3響應中斷(第143 - 144頁)的書「Java併發實踐」中的示例 它在書中說在循環中調用可中斷阻塞方法
不支持取消但仍然調用可中斷阻塞方法的活動必須在循環中調用它們,在檢測到中斷時重試。在這種情況下,他們應該在本地保存中斷狀態並在返回之前恢復它,如下面的示例所示,而不是立即捕獲InterruptedException。設置中斷狀態太ealry可能會導致一個無限循環,因爲大多數中斷阻塞方法,檢查進入中斷狀態,如果立即將其設置拋出InterruptedException ......
public Task getNextTask(BlockingQueue<Task> queue) {
boolean interrupted = false;
try {
while (true) {
try {
return queue.take();
} catch (InterruptedException e) {
interrrupted = true;
}
}
} finally {
if (interrupted)
Thread.currentThread().interrupt();
}
}
我的問題是爲什麼需要循環?
另外,如果queue.take()拋出一箇中斷的異常,那麼我假設中斷標誌在當前線程上設置正確?然後,下一次調用queue.take()將再次拋出interruptException,因爲當前線程上的前一箇中斷沒有被清除,並且這不會導致無限循環?