java 对阻塞线程执行 interrupt 方法的一些问题

据我所知,对正在阻塞的线程,如 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());
    }
}

执行结果见下图:

img

想知道这里为什么中断标记是 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());
    }
}

img

如有帮助,欢迎采纳哈!

我的《Java并发编程学习笔记》 正在更新中,欢迎一起讨论交流

在这里插入图片描述

欢迎star支持下!!!

主线程被打断了,然后发出线程中断的信号,其他线程收到了通知,所以会打印出true