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

标签 java multithreading

在许多来源中我发现 Thread.interrupted()方法清除线程的中断状态,但没有一个解释该方法到底以这种方式工作的原因。

我仍然感到有点困惑,因为缺乏对这个原因的理解,也缺乏对java设计者试图通过清除中断状态来解决什么问题的理解。

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

最佳答案

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

线程判断自己是否被中断的方式主要有两种:

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

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

关于java - Thread.interrupted()清除线程中断状态的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35673314/

相关文章:

工作队列的 Java 并发抽象

java - 2D 游戏范式

c - 多线程和strtok

java - 如何使用 subList()

java - 为什么 UIManager.getDefaults().keySet() 返回的值与 UIManager.getDefaults().keys() 不同?

java - 从 GAE 批量下载日志

java - 在 Android 中使用 WebView 访问麦克风

c++ - 从并行线程在主 Maya 线程上执行代码

java - 在 swing 中打开一个新框架后无法使用按钮关闭框架

android - flex 移动项目中的多线程