无法理解thread.interrupt()方法的行为

时间:2016-06-01 09:32:35

标签: java multithreading

proportion_of_day_required

我不明白为什么控制台

  

true true我被打断了!!

但我认为结果是

  

真的我被打断了!!真

为什么结果不是我想的?谢谢!

2 个答案:

答案 0 :(得分:2)

TL; DR: Thread#interrupt()方法不立即涉及InterruptedException异常,它只是将名为中断状态的内部标志设置为true,这然后由受影响的线程检查一个。

  

使用称为的内部标志实现中断机制   中断状态。调用Thread.interrupt设置此标志。当一个   线程通过调用静态方法检查中断   Thread.interrupted,中断状态被清除。非静态的   Thread.isInterrupted,由一个线程用来查询   另一个中断状态,不改变中断状态   标志。

因此,在中断状态设置和抛出InterruptedException之间会发生一些最小延迟,这解释了在您同时调用I'm interrupted!!之后打印Thread.isAlive()的原因。< / p>

答案 1 :(得分:1)

这是一个时间问题。

如果主线程继续并在thread.isAlive()实际终止之前打印thread,则会打印true。您可以通过在第二个输出处放置一个断点来检查这一点,然后稍等片刻,然后让程序继续运行。它会打印false进行第二次isAlive检查。

根据主线程与其他线程之间的上下文切换,程序的输出可能会不时不同。

实际上,在查询线程状态时,您甚至无法确定第二个线程是否已经处于休眠状态。如果要使线程的执行顺序相互依赖,则需要在线程之间引入一些同步。