proportion_of_day_required
我不明白为什么控制台
true true我被打断了!!
但我认为结果是
真的我被打断了!!真
为什么结果不是我想的?谢谢!
答案 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
检查。
根据主线程与其他线程之间的上下文切换,程序的输出可能会不时不同。
实际上,在查询线程状态时,您甚至无法确定第二个线程是否已经处于休眠状态。如果要使线程的执行顺序相互依赖,则需要在线程之间引入一些同步。