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

amj*_*amj 0 java multithreading interrupt

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

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

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

cli*_*ton 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())更好)