为什么它会在这里造成无限循环

时间:2014-01-06 15:38:24

标签: java multithreading

好吧,我正在读一篇涉及java中断的文章。现在我不太了解样本,如下所示:   enter image description here

我想知道它为什么会在那里引起无限循环。“它无法提前恢复中断状态”意味着什么。   感谢任何帮助。谢谢。

2 个答案:

答案 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 ...
 }