为什么对于 Thread 的子类吞下 InterruptedException 是可以的?

ash*_*aka 5 java concurrency multithreading exception-handling

在 Brian Goetz关于如何处理 InterruptedException文章中,有一段很突出:

吞下中断是可以接受的一次是当您知道线程即将退出时。这种情况只发生在调用可中断方法的类是线程的一部分而不是 Runnable 时。

我不明白这个。原因是否与 Runnable 可能由线程池处理而 Thread 是您自己开始的事情有关?

Tom*_*ine 3

我认为扩展Thread是没有必要的,因此实施Runnable是首选。

但重要的是代码知道线程将要退出。如果您的代码是某些通用回调接口的一部分,那么您将无法知道您是如何被使用的。您可以被传递到线程池(事实上,我们可能应该使用池而不是Thread在代码中不适当的点构造 s)。OTOH,通常Runnable是一个匿名内部类,因此,在源代码级别,它是确实知道发生了什么的封闭方法的一部分。

因此,如果线程即将退出,重置当前线程的中断状态是没有意义的,因为没有什么可以中断。

在某些时候,你会想说它已经足够中断了。例如,即使任务被中断,线程池也可以继续使用线程,尽管它们可能希望InterruptException为尝试接取任务的调用者保留线程。

库通常不能正确处理中断。IMO,中断没有有意义的上下文。没有他们,生活会简单得多,不幸的是他们让人们感觉到了他们的存在。