在许多来源中,我发现Thread.interrupted()
方法清除线程的中断状态,但没有一个解释为什么这种方法完全以这种方式工作。
我仍然感到有点困惑,因为缺乏对这个原因的理解,并且没有低估Java的设计者试图通过清除中断状态来解决的问题。
如果有人能解释这一点并举一些例子,我将不胜感激。
线程中断背后的想法是,一个线程可能会向另一个线程发出信号,请求它中断是常规处理,以将其注意力转移到某些特定于线程的特殊操作上。 线程在响应中实际执行的操作完全取决于该线程中运行的代码。
线程可以通过两种主要方式确定它是否已中断:
- 如果在设置了中断
- 状态为"中断"的线程中调用,或者在方法执行时线程中断,则多个
Thread
和Object
方法将引发InterruptedException
。 在此事件中,中断状态被清除,大概是因为异常被视为中断的充分通知。 - 线程中运行的代码可以调用
Thread.interrupted()
或Thread.currentThread().isInterrupted()
来主动测试中断。 前者还会重置中断状态;后者没有,可能是因为它是一个实例方法 - 如果一个线程调用另一个线程的isInterrupted()
方法,中断不得丢失。
导致中断状态重置的技术这样做是为了使线程能够处理后续中断。 这里的关键点可能是线程中断不一定会导致中断的线程关闭(尽管这确实是线程可以做出的一种响应)。 这是一个更普遍的机制。
来自 jdoc
中断是线程的指示,指示它应该停止它正在做的事情并做其他事情。由程序员来决定线程如何响应中断,但线程终止是很常见的
和
按照约定,任何通过引发 InterruptedException 退出的方法都会在这样做时清除中断状态。但是,总是有可能通过另一个线程调用中断立即再次设置中断状态。
因此,Thread.interrupted 会清除该标志,因为总是有可能通过另一个线程调用中断立即再次设置中断状态。
解释 https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html