【问题标题】:How exactly does Thread.interrupt() and Thread.interrupted() work? [duplicate]Thread.interrupt() 和 Thread.interrupted() 究竟是如何工作的? [复制]
【发布时间】:2012-10-07 09:29:15
【问题描述】:

从设置线程状态的角度来看,这两种方法我不是很清楚。

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

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

【问题讨论】:

标签: java multithreading interrupt


【解决方案1】:

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

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

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

典型用例:

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

【讨论】:

  • 连续调用两次可能返回false,即使第一次返回true。但它可能会连续两次返回 true,因为它可以在第二次调用运行之前被中断。
  • 是的,这也可能发生,它在JavaDoc中给出
【解决方案2】:

您可以使用 Thread.interrupt() 来告诉线程停止。当该线程执行一些阻塞操作或检查标志时,它会触发它抛出一个 InterruptedException 来唤醒线程或停止它。

虽然 interrupt() 的目的通常是停止线程,但这并不意味着它会。可以长时间忽略中断或完全忽略中断。如果它触发了 InterruptedException,则可以捕获并记录(或忽略)它,而不是停止线程。

注意:对于 ExecutorService 中的线程,中断任务会中断线程,而 ExecutorService 会根据设计捕获这一点并且不会关闭线程。

【讨论】:

  • 我可能不会在这种情况下使用“停止”。 Thread#interrupt 不会“停止”不关注 interrupted 状态的线程
  • 另外值得注意的是,一个线程可能不会立即停止,即使它确实服从中断请求。
猜你喜欢
  • 2012-01-26
  • 2019-10-12
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2017-05-13
  • 2020-10-17
  • 1970-01-01
  • 2020-11-26
相关资源
最近更新 更多