Thread.interrupted()清除线程中断状态的原因是什么?

时间:2016-02-27 17:55:51

标签: java multithreading

在许多来源中,我发现Thread.interrupted()方法清除了线程的中断状态,但是在这些方法中都没有解释为什么这种方法完全以这种方式工作的原因。

我仍然感到困惑,因为对这个原因缺乏了解,并且缺乏对java设计师试图通过清除中断状态解决的问题的理解。

如果有人可以解释并展示一些例子,我将非常感激。

2 个答案:

答案 0 :(得分:3)

线程中断背后的想法是,一个线程可能会发出另一个线程的信号,要求它中断是常规处理,以将注意力转移到某些特定于线程的特殊操作。线程实际上做的响应完全取决于该线程中运行的代码。

Thread有两种主要方式可以确定它是否已被中断:

  1. 如果在设置了中断状态的线程中调用,或者在执行方法时线程被中断,则多个ThreadObject方法将抛出InterruptedException。在这种情况下,中断状态被清除,大概是因为异常被认为是中断的充分通知。
  2. 线程中运行的代码可以调用Thread.interrupted()Thread.currentThread().isInterrupted()来主动测试中断。前者也会重置中断状态;后者不是,可能是因为它是一个实例方法 - 如果一个线程调用另一个线程的isInterrupted()方法,则不能丢失中断。
  3. 导致中断状态被重置的技术这样做是为了使线程能够处理后续中断。这里的关键点可能是线程中断并不一定会导致中断的线程关闭(尽管这确实是线程可以做出的一个响应)。这是一种更为通用的机制。

答案 1 :(得分:0)

来自jdoc

  

中断是一个线程的指示,它应该停止它正在做的事情并做其他事情。由程序员决定线程如何响应中断,但线程终止是很常见的

  

按照惯例,任何通过抛出InterruptedException退出的方法都会在执行此操作时清除中断状态。但是,通过另一个调用中断的线程,总是可以立即再次设置中断状态。

因此,Thread.interrupted会清除该标志,因为通过另一个调用中断的线程,它总是可以立即再次设置中断状态。

解释https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html