美文网首页Java 杂谈
7 什么是线程中断

7 什么是线程中断

作者: Dream_Lin | 来源:发表于2019-01-18 14:32 被阅读0次

    线程中断

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

    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;
                }
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:7 什么是线程中断

        本文链接:https://www.haomeiwen.com/subject/hpjndqtx.html