好吧,我正在读一篇涉及java中断的文章。现在我不太了解样本,如下所示:
我想知道它为什么会在那里引起无限循环。“它无法提前恢复中断状态”意味着什么。 感谢任何帮助。谢谢。
答案 0 :(得分:1)
如果take()
像网站所说的那样抛出InterruptedException
,则可能会发生无限循环。
这是因为表达式在返回之前进行了求值,因此如果对它的求值引发异常,则会立即跳转到catch
块,跳过return
。
答案 1 :(得分:1)
我想知道它为什么会在那里引起无限循环。“它无法提前恢复中断状态”意味着什么。
通常,您会在catch
块中立即恢复中断状态 。但是,如果在这种情况下完成此操作然后它再次循环并再次调用take()
,则会导致另一次抛出InterruptedException
并且无限循环。
对我来说,代码的问题是,如果线程被中断,代码会循环并再次调用take()
。通常我们处于类似的循环中:
while (!Thread.currentThread().isInterrupted()) {
...
}
也许代码的作者混淆了虚假中断的虚假唤醒?我认为后者确实不会发生。当然会发生虚假的唤醒,但这些是由queue.take()
方法内部处理的。
通常我们使用类似下面的代码恢复线程中断状态:
try {
queue.take();
} catch (InterruptedException ie) {
// because catching InterruptedException clears the thread interrupt bit,
// we immediately re-interrupt the current thread.
Thread.currentThread().interrupt();
// handle the interrupt here by quitting or returning or ...
}