JDK8和JDK17 Thread.interrupt() 实现区别
一、Interrupt打断阻塞
以下相同的代码分别在JDK8和JDK17中执行会得到不同的结果,基于两个不同的实现版本源码是不一样的,JDK17在调用interrupt方法时会将interrupted设置为true,JDK8不会进行设置。当前线程在调用sleep()、wait()、join()方法时被阻塞,则其中断状态将被清除,并且将会抛出InterruptedException
package com.kh.JUC;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Interrupt {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
log.info("sleep");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}, "t");
t.start();
Thread.sleep(1000); // 不进行sleep的话会先执行main线程的输出再执行t线程
log.info("Interrupt");
t.interrupt();
log.info("Is Interrupt: " + t.isInterrupted());
}
}
二、JDK8执行结果
三、JDK17执行结果:
四、JDK8实现
五、JDK17实现
该方法用于中断线程。主要逻辑如下:
检查当前线程是否有权限中断目标线程,若无权限则抛出SecurityException。
如果线程在等待或阻塞状态,清除中断状态并抛出InterruptedException。
如果线程在I/O操作上被阻塞,则关闭通道并设置中断状态。
如果线程在选择器上被阻塞,则立即返回并设置中断状态。
如果以上条件都不满足,则仅设置中断状态。