Java 在线程运行时中断线程;下一次中断的影响是什么?

Java 在线程运行时中断线程;下一次中断的影响是什么?,java,multithreading,interruption,Java,Multithreading,Interruption,让我们假设线程t1正在运行(即未处于睡眠、等待或加入状态)。另一个线程t2中断t1。Javadoc说t1的中断状态将被设置 让我们假设t1稍后进入睡眠、等待或加入状态。会发生什么 i) 由于线程t1具有中断状态,它是否会自动引发InterruptedException 假设t1仍处于睡眠、等待或加入状态。让我们想象一下t2再次中断t1: ii)线程t1是通过中断执行引发的,还是需要先调用中断()来清除其中断状态 在这一点上有官方的Java立场吗?谢谢。检查线程的中断状态将清除状态标志;也就是说,

让我们假设线程t1正在运行(即未处于睡眠、等待或加入状态)。另一个线程t2中断t1。Javadoc说t1的中断状态将被设置

让我们假设t1稍后进入睡眠、等待或加入状态。会发生什么

i) 由于线程t1具有中断状态,它是否会自动引发
InterruptedException

假设t1仍处于睡眠、等待或加入状态。让我们想象一下t2再次中断t1:

ii)线程t1是通过
中断执行引发的,还是需要先调用
中断()
来清除其中断状态


在这一点上有官方的Java立场吗?谢谢。

检查线程的中断状态将清除状态标志;也就是说,引发
中断异常的代码正在清除状态,因为您自己的代码会手动对状态进行采样。

在第一种情况下(“i”),是的,休眠线程将通过抛出
中断异常来弹出对
线程#sleep()
的调用。此时,由表示的线程状态标志将被清除;调用
线程#isInterrupted()
将返回false。由于
InterruptedException
正在运行,消息已发送给所有可传递的呼叫者

然后,调用方有责任捕获该异常并执行以下两项操作之一:

  • 退出当前线程,或者
  • 调用当前线程(即,
    thread.currentThread().interrupt()
当你说线程“t1”处于“睡眠、等待或连接状态”时,在通过
InterruptedException退出对
thread\sleep()
的初始调用后,唯一可能的情况是,如果它捕获到异常,忽略它,并在线程“t2”之前再次调用一些阻塞方法,如
thread.sleep()
有机会再次打断它

如果线程“t2”再次中断线程“t1”,而“t1”当前在可中断的方法调用上被阻塞,“t1”的调用将再次以
InterruptedException
退出。否则,线程的中断标志将设置为稍后检测

每次调用
Thread#interrupt()
,该目标线程的中断状态将设置为“true”,这意味着该线程自上次清除中断状态以来已被中断。下次被中断的线程尝试对可中断方法进行阻塞调用时,线程的中断状态将被清除,该方法将抛出
InterruptedException

请注意,这样清除中断状态不会丢失信息,只要清除后立即抛出
InterruptedException
。抛出的
InterruptedException
最好解释为:“此线程在之前的某个点设置了中断状态,现在您有责任做出反应,并且通常会向后续调用方发出预期中断的警告。”通过调用
thread#interrupt()
捕获
中断异常后,恢复中断状态以供其他人查看

有关此协议的更权威的描述,请参阅本书