据我所知,对正在阻塞的线程,如 sleep 中的线程,执行 interrupt 方法,会使该线程抛出异常,但是中断标记依旧是 false。我使用如下代码进行了验证:
import static java.lang.Thread.sleep;
public class MainDemo {
public static void main(String[] args) throws InterruptedException{
Thread thread = new Thread(() -> {
try {
sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
thread.start();
sleep(1000);
System.out.println( "interrupt...");
thread.interrupt();
System.out.println("中断标记:" + thread.isInterrupted());
}
}
执行结果见下图:
想知道这里为什么中断标记是 true,而不是 false,按理来说应该是 false,因为打断阻塞线程,会以抛出异常的方式来执行。
thread.interrupt() 这里可以理解为 子线程发出了中断请求,子线程中的sleep响应了中断,抛出了 InterruptedException,这个过程需要时间,所以你下面发出中断后立即调用 thread.isInterrupted(),此时 子线程 可能还没响应,或者响应了还没运行结束。
参考如下:
public class Demo {
public static void main(String[] args) throws InterruptedException{
Thread thread = new Thread(() -> {
try {
sleep(5000);
} catch (InterruptedException e) {
System.out.println("InterruptedException");
throw new RuntimeException(e);
}
});
thread.start();
sleep(1000);
System.out.println("中断标记before:" + thread.isInterrupted());
System.out.println( "start interrupt...");
thread.interrupt();
System.out.println( "end interrupt...");
sleep(1000);
System.out.println("中断标记after:" + thread.isInterrupted());
}
}
如有帮助,欢迎采纳哈!
我的《Java并发编程学习笔记》 正在更新中,欢迎一起讨论交流
主线程被打断了,然后发出线程中断的信号,其他线程收到了通知,所以会打印出true