Java中的中断(Interrupt)

Posted FightSH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的中断(Interrupt)相关的知识,希望对你有一定的参考价值。

概论

待完善

线程中断

中断代表线程状态,每个线程都关联了一个中断状态,是一个 true 或 false 的 boolean 值,初始值为 false。

关于中断状态,我们需要重点关注 Thread 类中的以下几个方法:

// 判断线程是否中断
public boolean isInterrupted() {}
// 判断线程的中断状态。调用时,会修改会线程中断状态为false(如果)
public static boolean interrupted() {}
// 该方法只是设置了 标识,并不会真正的中断一个线程
public void interrupt() {}

我们说中断一个线程,其实就是设置了线程的 interrupted status 为 true,至于说被中断的线程怎么处理这个状态,那是那个线程自己的事。如以下代码:

当然,中断除了是线程状态外,还有其他含义。

如果线程处于以下三种情况,那么当线程被中断的时候,能自动感知到:

  1. 来自 Object 类的 wait()、wait(long)、wait(long, int),

    来自 Thread 类的 join()、join(long)、join(long, int)、sleep(long)、sleep(long, int)

    这几个方法的相同之处是,方法上都有: throws InterruptedException

    如果线程阻塞在这些方法上(我们知道,这些方法会让当前线程阻塞),这个时候如果其他线程对这个线程进行了中断,那么这个线程会从这些方法中立即返回,抛出 InterruptedException 异常,同时重置中断状态为 false。

  2. 实现了 InterruptibleChannel 接口的类中的一些 I/O 阻塞操作,如 DatagramChannel 中的 connect 方法和 receive 方法等

    如果线程阻塞在这里,中断线程会导致这些方法抛出 ClosedByInterruptException 并重置中断状态。

对于以上2种情况比较特殊的,因为他们能自动感知到中断(这里说自动,当然也是基于底层实现),并且在做出相应的操作后都会重置中断状态为 false。

特殊情况:如果线程阻塞在 LockSupport.park(Object obj) 方法,也叫挂起,这个时候的中断也会导致线程唤醒,但是唤醒后不会重置中断状态,所以唤醒后去检测中断状态将是 true。

以上是关于Java中的中断(Interrupt)的主要内容,如果未能解决你的问题,请参考以下文章

Java学习-073-多线程06:线程中断 interrupt()

java 多线程5: java 终止线程及中断机制 (stop()interrupt() interrupted()isInterrupted())

从头认识java-17.2 线程中断(interrupt)

java中interrupt的使用

Java多线程的中断原理和 interrupt() 几个方法简介

关于Java多线程-interrupt()interrupted()isInterrupted()解释