java - Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的?

标签 java multithreading interrupt

从设置线程状态的角度,我对这两种方法不太清楚。

Java 文档说 Thread.interrupt() 设置线程中断状态标志,调用 Thread.interrupted() 方法给出线程的状态并清除标志。

当这在实际场景中使用时..??

最佳答案

当其他线程调用 Thread.interrupt() 时,该方法将线程的中断状态标志(最初为 false)设置为 true。如果线程处于阻塞方法,如 Thread.sleep()、Thread.join() 或 Object.wait(),它将解除阻塞并抛出 InterruptedException。

Thread.interrupted() 是一个静态方法,可用于检查中断状态标志的当前值,true 或 false。它还清除中断状态,将标志设置为 false。也就是说,连续调用两次可能会返回 false,即使第一次返回 true(除非线程再次被中断,在第一次调用后将中断状态标志设置为 true)

注意第三个方法Thread.isInterrupted(),它可以在不重置的情况下检查中断状态。

典型用例:

  1. 从阻塞操作中异常中断
  2. 确定是否需要在某个逻辑保存/停止点继续执行长指令序列
  3. 在开始长时间运行的任务之前确定是否需要继续执行一系列指令
  4. 停止执行迭代过程,否则会永久持续(while(true) 不好,while(!Thread.interrupted()) 更好)

关于java - Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12928970/

相关文章:

assembly - 带键盘和中断的 PIC16F84A 组件

java - 如何从Android中的第三方库中删除多余的包?

java - 使用dom java解析xml

java - null 和 StringUtils.isBlank() 之间的区别

multithreading - 原子性和不变性是并发/并行编程中解决相同问题的两种不同方法吗?

assembly - ARM上CPSID指令与通用中断 Controller 的关系

java - 松开按键后停止动画

java - 从 Facebook 下载用户个人资料图片 : AsyncTask or HandlerThread

c - 用线程模拟火车

java - 线程似乎没有干净地退出 - 线程挂起