我正在阅读一些java线程中断,我不明白一些东西。希望有人能解释我。所以,它完成了以下代码
public Integer getInteger(BlockingQueue<Integer> queue) {
boolean interrupted = false;
try {
while (true) {
try {
return queue.take();
} catch (InterruptedException e) {
interrupted = true;
// fall through and retry
}
}
} finally {
if (interrupted)
Thread.currentThread().interrupt();
}
}
解释如下:
不支持取消但仍然致电的活动 可中断阻止方法必须在循环中调用它们, 检测到中断时重试。在这种情况下,他们应该保存 本地中断状态,并在返回之前恢复, 如清单所示。而不是立即抓住 InterruptedException的。过早设置中断状态可以 导致无限循环,因为大多数可中断阻塞 方法检查进入和抛出时的中断状态 如果已设置,则立即发生InterruptedException。 (可中断的方法 通常在阻止或做任何重大事件之前轮询中断 工作,以便尽可能地响应中断。)
我不明白为什么要在本地保存中断状态 我很高兴听到一些解释。
答案 0 :(得分:2)
通过设计,该方法无法抛出InterruptedException。所以这意味着我们总是希望从队列中获取一个值。但有人可能希望线程被中断,这就是为什么我们必须保存 - 在我们最终从队列中获取值后恢复被中断的状态。
因此,线程只有在从队列中获取值后才能完成。
更新:查看take()
方法实现。它具有以下作为第一个陈述:
public final void acquireInterruptibly(int arg) throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
...
}
答案 1 :(得分:1)
由于语句
,循环将完成return queue.take();
这不是一个紧凑的循环,即使它看起来像一个。它只阻塞一个元素,并在可用时立即返回,并在发生中断时重试。