美文网首页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 什么是线程中断

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

  • 泥瓦匠聊并发编程基础篇:线程中断和终止

    1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断...

  • 阿里P8聊并发编程:线程中断和终止

    一、线程中断 1.什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程...

  • Java并发编程基础-理解中断

    章节 什么是中断 中断线程的方法 线程中断状态的判断以及何时被中断的线程所处 isInterrupted() 状态...

  • 线程中断

    什么是线程中断?线程中断即线程运行过程中被其他线程打断了。 线程中断的重要方法2.1 java.lang.Thre...

  • (4)线程中断

    什么是线程中断 java中的线程中断并不是指强制线程中断执行,而是指调用线程中断起到一个通知作用,让线程知道自己被...

  • 问题:什么是线程的中断标志,如何设置和检查它,它是如何和中断异常

    问题 什么是线程的中断标志,如何设置和检查它,它是如何和中断异常相关的 答案 线程的中断标志 线程的中断标志,是每...

  • J.U.C之AQS:源码解析-响应中断

    什么是中断 参考 线程的中断 & Interrupt AQS如何响应 AQS响应中断的本质是让运行的线程能够从...

  • 线程中断

    什么是线程中断 Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处...

  • JAVA_线程中断与InterruptedException

    什么是线程中断: 要有线程中断,则需要有线程等待为前提:等待1.当线程调用了sleep,wait,join方法时,...

网友评论

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

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