InterruptedException:是什么原因引起的?

关于Java的InterruptedException有一些有趣的问题和答案,例如Java中的InterruptedException

的原因和处理InterruptedException。但是,它们都没有告诉我InterruptedException的可能来源。

像SIGTERM,SIGQUIT,SIGINT这样的OS信号呢?在命令行上按CTRL-C是否会产生InterruptedException?还有什么?

回答:

您列出的所有内容都不会产生InterruptedException

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

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

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

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

中断机制是使用内部标志(称为 中断状态)实现的

。调用Thread.interrupt设置此标志。当线程通过调用static方法检查中断时,将Thread.interrupted清除中断状态。isInterrupted一个线程用于查询另一线程的中断状态的非静态方法不会更改中断状态标志。

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

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

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


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

许多注意事项和“警告”你看到的关于处理InterruptedException并不意味着暗示,他们可以完全自发地抛出,他们是为了鼓励精心设计的对象,可以在那些还不知道上下文,这里使用interrupt()将被推定工作(所以真的,你

不想承担他们可以自发如果要创建可重用的对象,这将是稳健的未来的情况下被抛出-即你永远保证你的代码不会有一天被人谁希望使用中断工作)。

为了快速一次性项目你不 真正

需要担心这些例外,只要你肯定知道你是不是要求特殊处理interrupt(),而不是调用的东西,可以打电话interrupt(),但要注意的含义从长远来看,尤其是如果您最终在其他上下文中重用该代码时。

以上是 InterruptedException:是什么原因引起的? 的全部内容, 来源链接: utcz.com/qa/426558.html

回到顶部