interrupt 方法

简述

  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的时候就可以料理后事,然后终止即可。

 

posted @ 2021-07-26 23:15  艾尔夏尔-Layton  阅读(921)  评论(0编辑  收藏  举报