Thread.interrupt() 方法的工作原理是什么?

在 Java 中,线程的中断 interrupt 只是改变了线程的中断状态,至于这个中断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段。不但不是让线程停止运行,反而是继续执行线程的手段。

在一个线程对象上调用 interrupt() 方法,真正有影响的是 wait、join、sleep 方法,当然这 3 个方法包括它们的重载方法。请注意:上面这三个方法都会抛出 InterruptedException。

1、对于 wait 中的等待 notify、notifyAll 唤醒的线程,其实这个线程已经“暂停”执行,因为它正在某一对象的休息室中,这时如果它的中断状态被改变,那么它就会抛出异常。这个 InterruptedException 异常不是线程抛出的,而是 wait 方法,也就是对象的 wait 方法内部会不断检查在此对象上休息的线程的状态,如果发现哪个线程的状态被置为已中断,则会抛出 InterruptedException,意思就是这个线程不能再等待了,其意义就等同于唤醒它了,然后执行 catch 中的代码。

2、 对于 sleep 中的线程,如果你调用了 Thread.sleep(一年);现在你后悔了,想让它早些醒过来,调用 interrupt() 方法就是唯一手段,只有改变它的中断状态,让它从 sleep 中将控制权转到处理异常的 catch 语句中,然后再由 catch 中的处理转换到正常的逻辑。同样,对于 join 中的线程你也可以这样处理。

发表评论

后才能评论

评论(5)

  • 一蓑烟雨 普通 2022-09-29 9:41 上午

    也就是说,Thread.interrupt()是改变线程当前的状态为相反的状态,可以让正在执行的线程中断,也可以让正在等待的线程去执行(会抛异常)。

  • Chen 普通 2021-11-03 9:23 下午

    也就是说,调用interrupt()可以让处于waiting和time_waiting状态的线程,继续执行?可以这样理解吗?

    • 帅地 永久会员 @ Chen 2021-11-05 11:02 下午

      也不能这么说,就是 wait()本来处于等待状态,interrupt 操作之后,会迫使 wait 抛出异常。

      本来一个人是一直在等待不敢不说话的,然后队长说,你可以不用等了,那么这个人就回复了一句「好的」,然后就不等了。

  • 大俗⃰XD_ 普通 2021-09-28 4:01 上午

    博主您好,那个复制附带文本做个判断吧,
    每次复制一句话甚至一两个词也要到搜索引擎里删减挺不方便的。