中断异常:是什么原因造成的?

2022-09-01 19:04:55

关于Java的DisstrutedException,有一些有趣的问题和答案,例如Java中的The Cause of InterruptedExceptionProcessing InterruptedException。但是,他们都没有告诉我中断异常的可能来源。

像SIGTERM,SIGQUIT,SIGINT这样的操作系统信号呢?在命令行上按 CTRL-C 是否会产生中断异常?还有什么?


答案 1

您列出的任何内容都不会生成 .InterruptedException

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

17.2.3 中断

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

请参阅有关中断的官方教程以获取更多信息。具体说来:

线程通过调用要中断的线程的对象来发送中断。要使中断机制正常工作,中断线程必须支持其自身的中断。interruptThread

...

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

按照惯例,任何通过抛出来退出的方法在退出时都会清除中断状态。但是,总是有可能通过另一个线程调用 立即再次设置中断状态。InterruptedExceptioninterrupt

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

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


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

你看到的关于处理的许多注释和“警告”并不意味着它们可以完全自发地抛出,它们意味着鼓励设计良好的对象,这些对象可以在尚不为人知的上下文中使用,在那里可以假定有效(所以真的,你确实想假设它们可以自发地抛出,如果你正在创建可重用的对象,这些对象在未来的情况下将是健壮的 - 也就是说,你永远无法保证你的代码不会有一天被那些期望中断工作的人使用)。InterruptedExceptioninterrupt()

对于快速的一次性项目,只要您确定自己没有调用并且没有调用可以调用的东西,您不必担心这些异常的特殊处理,但是从长远来看,请注意它的影响,特别是如果您最终在其他上下文中重用该代码。interrupt()interrupt()


答案 2

推荐