简述
interrupt方法用于打断sleep,wait,join的线程,interrupt不会真的中断线程,它的本质只是设置一个中断状态,让该被打断线程决定如何结束。
阻塞状态
当线程处于sleep,wait,join等阻塞状态时,interrupt方法会清空打断状态,并抛出InterruptedException异常。我们需要注意的是,Java中凡是抛出InterruptedException的方法(再加上Thread.interrupted()),都会在抛异常的时候,将interrupt flag重新置为false。
这也就是说,当一个线程B被中断的时候(比如正在sleep()),它会结束sleep状态,抛出InterruptedException,并将interrupt flag置为false。这也就意味着,此时再去检查线程B的interrupt flag的状态,它是false,不能证明它被中断了,现在唯一能证明当前线程B被中断的证据就是我们现在catch到的InterruptedException。如果我们不负责任地直接把这个InterruptedException扔掉了,那么没有人知道刚刚发生了中断,没有人知道刚刚有另一个线程想要让线程B停下来,这是不符合程序的目的的:别的线程想让它停下来,而它直接忽略了这个操作。
打断正在运行的线程
interrupt不会真的打断正在运行的线程,他会将线程的打断状态设置为true。如果该线程想停止,则检测到打断状态为true进行停止即可。
两阶段终止
在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个”料理后事””的机会,即让T2完成善后工作后终止
我们在catch到异常和检查到打断标记为true的时候就可以料理后事,然后终止即可。
一点一点积累,一点一点蜕变!