再谈线程中断

无意中在某地方中看到了这样一个问题,大致代码如下:

/**
 * @author Dongguabai
 * @date 2018/9/22 0:01
 */
public class TestInterrupt2 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            while (true){
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"Dongguabai");
        thread.start();
        TimeUnit.SECONDS.sleep(1);
        thread.interrupt();
        System.out.println("before:   "+thread.isInterrupted());
        TimeUnit.SECONDS.sleep(1);
        System.out.println("after:   "+thread.isInterrupted());
    }
}

运行结果为:

before:   false
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.zj.bda.concurrent.TestInterrupt2.lambda$main$0(TestInterrupt2.java:14)
	at java.lang.Thread.run(Thread.java:745)
after:   false

其实这段代码的作者就是想演示这样一个东东:这个我取名为”Dongguabai“的thread执行了interrup()方法,那么接下来线程执行thread.isInterrupted()的时候,应该返回的是true,但是这里怎么返回的是false呢。

原因其实很简单,thread在启动后会执行sleep()方法,此时线程会进入休眠状态,而进入休眠状态的线程执行了interrup()后会抛出InterruptedException,此时中断标识位会被清除,所以此时thread.isInterrupted()会返回false。怎么证明呢,可以把代码适当修改下:

再谈线程中断_第1张图片

本质就是不让thread抛出InterruptedException嘛,也就是说在thread.sleep之前执行thread.interrupt()。

具体关于线程中断可参看:

https://blog.csdn.net/Dongguabai/article/details/82318002

 

你可能感兴趣的:(再谈线程中断)