Java 杂谈

7 什么是线程中断

2019-01-18  本文已影响0人  Dream_Lin

线程中断

线程中断指的是线程的一种状态,中断不是自发产生的,而是其它线程发出的一种指令.本线程通过判断是否接收中断指令,来对其它线程发出的中断指令做具体的响应.

sleep方法和中断

调用sleep方法的时候,sleep方法可能会抛出一个中断异常,这是因为sleep方法内部会不断的去判断是否收到中断指令,一旦收到,则方法内部立即抛出InterruptException.但其实是否收到中断指令是可以主动调用方法去判断的,只不过sleep方法内部已经实现这段逻辑.当线程被其它线程中断之后,后续该如何响应中断由本线程负责,中断是线程间的一种约定.

代码实例1

/**
 * 开启一个睡眠五秒的子线程,一秒过后主线程向它发出中断指令,则那个线程实际上只睡眠了一秒,因为在睡眠过程中收到中断命令
 */
public class SleepInterruptDemo {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new TaskA());
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
    }

}

class TaskA implements Runnable {

    @Override
    public void run() {
        long beginTime = System.currentTimeMillis();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            System.out.println("被中断了--");
        }
        System.out.println("睡眠时间:" + (System.currentTimeMillis() - beginTime) / 1000 + "秒");
    }
}

思考

假如子线程在sleep方法期间没有收到中断指令,那么后续再收到中断指令,程序会抛出异常或是做其它工作吗?答案是不会发生任何事.因为sleep方法的内部调用了Thread.interrupted去判断是否收到中断指令,既然sleep方法已经执行完毕,那么就不会再执行到sleep方法内部判断中断指令的逻辑了要判断是否收到中断指令,就需要主动调用Thread.interrupted方法去判断是否收到中断指令.

代码验证

/**
 * 子线程主动判断是否收到中断指令
 */
public class CheckInterruptStatusDemo {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new TaskA());
        thread.start();
        Thread.sleep(3000);
        thread.interrupt();
    }

}

class TaskA implements Runnable {

    @Override
    public void run() {
        //在收到中断指令前,sleep已经执行完毕
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            //此处在本程序,不会被执行
            System.out.println("sleep被中断");
        }
        while (true) {
            System.out.println("等待!");
           /* 主动判断是否接收到中断指令*/
            if (Thread.interrupted()) {
                System.out.println("被中断 准备退出!");
                return;
            }
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读