乐趣区

关于java: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。

退出移动版