InterruptedException:是什么原因造成的?

use*_*755 17 java interrupted-exception

关于Java的InterruptedException有一些有趣的问题和答案,例如Java中的InterruptedException处理InterruptedException 的原因.但是,它们都没有告诉我InterruptedException的可能来源.

那些OS信号如SIGTERM,SIGQUIT,SIGINT?在命令行上按CTRL-C会产生InterruptedException吗?还有什么?

Jas*_*n C 22

你列出的东西都没有产生InterruptedException.

唯一可以中断线程的是调用Thread#interrupt().从第17.2.3节开始,JLS在这个问题上相对清楚:

17.2.3中断

中断操作在调用时发生Thread.interrupt,以及定义为依次调用它的方法,例如ThreadGroup.interrupt.

有关更多信息,请参阅有关中断的官方教程.特别:

线程通过调用发送一个中断interrupt的上Thread对象被中断的线程.为使中断机制正常工作,被中断的线程必须支持自己的中断.

...

中断机制使用称为中断状态的内部标志来实现.调用Thread.interrupt设置此标志.当线程通过调用静态方法检查中断时,将Thread.interrupted清除中断状态.非静态isInterrupted方法(由一个线程用于查询另一个线程的中断状态)不会更改中断状态标志.

按照惯例,任何通过抛出InterruptedException清除中断状态而退出的方法.但是,通过另一个线程调用,总是可以立即再次设置中断状态interrupt.

这意味着它只是通过调用interrupt()而不是由其他未知外部事件触发而设置的显式标志.引用它的各种方法中的异常描述进一步暗示了这一点,例如(强调我的):

InterruptedException- 如果任何线程中断了当前线程.抛出此异常时,将清除当前线程的中断状态.


中断系统的目的通常是提供一个通用的,定义良好的框架,允许线程在其他线程中中断任务(可能是耗时的).虽然您可以在自己的应用程序中使用显式逻辑实现类似的功能,但是使用这种定义良好的机制允许独立的类(例如JDK,其他第三方代码,您自己的代码中的其他独立类)以一致的方式提供此功能. .

你看到的关于处理的许多注释和"警告" InterruptedException并不意味着它们可以被完全自发地抛出,它们旨在鼓励设计良好的对象,这些对象可以在尚未知晓的情境中使用,在哪里interrupt()可以推测工作(所以,你真的想要假设如果你创建的可重用对象在未来的情况下会很强大,你可以自发地抛出它们 - 也就是说,你永远不能保证你的代码不会被某些人预期使用中断工作).

为了快速一次性项目你不真正需要,只要你肯定知道你是不是打电话来担心这些例外情况特殊处理interrupt(),而不是调用的东西,可以打电话interrupt(),但要注意的含义从长远来看,特别是如果你最终在其他环境中重用该代码.