【Java多线程】interrupt中断

1.理解中断

中断可以理解为线程的一个标志位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。
线程通过检查自身被中断来进行响应。这句话的意思是,中断并不能打断影响线程的运行,只是一个标记属性,被中断的线程自身可以根据标记属性决定接下来做什么操作。

线程通过isInterrupted()来进行判断是否被中断。
也可以调用静态方法Thread.interrupted()方法判断,它会对当前线程的中断标识位进行复位。

如果该线程已处于终结状态,即使该线程被中断过,再调用该线程对象的isInterrupted()时依旧会返回false。
很多会抛出InterruptedException的方法,JVM在抛出InterruptedException之前,会将线程的中断标识位清除,然后抛出InterruptedException,此时调用isInterrupted()方法将会返回false。

2.打断的情况

2.1 打断阻塞

打断wait,sleep,join,会清空打断标记,使打断标记恢复到false

2.2 打断正常

打断标记为true。
线程知道有其他线程打断它,但并不会停下来。由自己决定是否停止运行 。

2.3 打断park

park线程被打断后,打断标记为true(跟打断正常线程相似)。
但是,被打断过的线程再想执行park就停不下来了。

举例:
在这里插入图片描述
在这里插入图片描述
虽然Thread.currentThread().isInterrupted()打印的打断状态为true,但Thread.currentThread().isInterrupted()方法内部已经把打断状态设为false了。

3.两阶段终止模式

代码中可以通过while循环实现。
在这里插入图片描述 因为出现异常时打断标记会被清除为false,上图的 设置打断标记 是把标记设置为true,这样就可以退出循环。