0

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

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

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

4

2 回答 2

7

当其他一些线程调用 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())更好)
于 2012-10-17T07:31:29.853 回答
1

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

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

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

于 2012-10-17T07:32:04.107 回答