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



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

我仍然感到有点困惑,因为缺乏对这个原因的理解,并且没有低估Java的设计者试图通过清除中断状态来解决的问题。

如果有人能解释这一点并举一些例子,我将不胜感激。

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

线程可以通过两种主要方式确定它是否已中断:

    如果在设置了中断
  1. 状态为"中断"的线程中调用,或者在方法执行时线程中断,则多个 ThreadObject 方法将引发InterruptedException。 在此事件中,中断状态被清除,大概是因为异常被视为中断的充分通知。
  2. 线程中运行的代码可以调用Thread.interrupted()Thread.currentThread().isInterrupted()来主动测试中断。 前者还会重置中断状态;后者没有,可能是因为它是一个实例方法 - 如果一个线程调用另一个线程的isInterrupted()方法,中断不得丢失。

导致中断状态重置的技术这样做是为了使线程能够处理后续中断。 这里的关键点可能是线程中断不一定会导致中断的线程关闭(尽管这确实是线程可以做出的一种响应)。 这是一个更普遍的机制。

来自 jdoc

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

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

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

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

最新更新