这个问题来自Brian Goetz的“Java并发实践”一书中的一个例子,第7章,7.1.3响应中断(第143-144页)它在书中说
不支持取消但仍调用可中断阻塞方法的活动将不得不循环调用它们,并在检测到中断时重试。在这种情况下,他们应该在本地保存中断状态并在返回之前将其恢复,如下例所示,而不是在捕获 InterruptedException 后立即恢复。过早设置中断状态可能会导致无限循环,因为大多数可中断阻塞方法会在进入时检查中断状态,如果设置了则立即抛出 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() 抛出了一个 interruptedException 那么我假设在当前线程上设置了中断标志对吗?然后对 queue.take() 的下一次调用将再次抛出 interruptedException,因为当前线程上的上一个中断没有被清除,这不会导致无限循环吗?