为什么要调用Thread.currentThread().interrupt()?

5

我在 Effective Java 这本书中看到了 Bloch 给出的一个示例代码,如下所示:

enter image description here

现在,我想澄清一下调用了 Thread.currentThread().interrupt() 的目的。我读了书中给出的解释,但仍感到困惑:

enter image description here

有没有人能够进一步解释一下呢?


你不明白哪一部分? - Maroun
@ᴍarounᴍaroun:我想知道为什么要调用Thread.currentThread().interrupt(),因为当前线程已经被中断了。 - tuan long
2个回答

12

当你捕获到InterruptedException时,线程的中断标志会被清除。通过调用Thread.currentThread().interrupt(),您可以再次设置中断标志,以便栈上更高层次的客户端知道线程已被中断并相应地做出反应。在这个例子中,Executor就是一个这样的客户端。

您可能希望阅读这篇文章获取更详细的解释。


1
那为什么不直接不捕获异常,如果目标是让执行器来处理它呢? - T.J. Crowder
1
@T.J.Crowder 这是一个已检查的异常,因此您必须使用 Callable 而不是 Runnable。但这会更简单。 - Peter Lawrey
@PeterLawrey:当然。而且interrupt在调用它的地方不会抛出异常,它会导致任何等待线程的东西抛出异常。谢谢。 - T.J. Crowder
非常感谢,我已经阅读了那篇文章,并从中学到了很多。 - tuan long
1
@AndreyTyukin 看起来 IBM 已经移动或删除了这篇文章。我已经编辑了链接,指向了一个副本。无论如何,通过谷歌搜索“Brian Goetz 处理 InterruptedException”也应该能找到一些替代方案。 - bowmore
显示剩余3条评论

2
当像await()这样的方法被中断或在中断线程中调用时,中断标志被清除,因此后续调用不会因为先前的中断而立即停止。
为了避免这种情况,catch子句重新中断线程,以便标志仍然设置,并且run之外的代码知道它已被中断并适当地处理它(通常是关闭工作线程)。

非常感谢,我明白了。 - tuan long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接