Thread.interrupt()和Thread.interrupted()究竟是如何工作的?

时间:2012-10-17 07:10:42

标签: java multithreading interrupt

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

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

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

2 个答案:

答案 0 :(得分:7)

当其他一些线程调用Thread.interrupt()时,该方法将Thread的中断状态标志(最初为false)设置为true。如果Thread处于阻塞方法,如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())更好)

答案 1 :(得分:1)

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

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

注意:对于ExecutorService中的线程,中断任务会中断线程,ExecutorService会按设计捕获它,并且不会关闭线程。