美文网首页
线程中断

线程中断

作者: 编码之路从零开始 | 来源:发表于2019-04-18 15:16 被阅读0次

中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断

中断只是通知一下该线程,但是不强制停止。如果响应中断时不做处理,该线程还是会继续运行下去的。

中断好比其他线程给该线程打了个招呼调用该线程的interrupt()方法
该线程可以判断自己是否被中断线程内部调用isInterrupted()方法,被中断返回true
该线程可以对中断标识位进行复位线程内部调用静态方法Thread.interrupted()方法

public class Interruped {
    public static void main(String[] args) throws InterruptedException {
        Thread runner = new Thread(new Runner(),"thread01");
        runner.start();
        // 让该线程充分运行
        TimeUnit.SECONDS.sleep(5);
        
        // 通知该线程可以停止了
        runner.interrupt();
    }
    
    static class Runner implements Runnable{
        @Override
        public void run(){
            while(true){
                // 通过isInterrupted()判断当前线程是否被中断
                if (Thread.currentThread().isInterrupted()) {
                   System.out.println(Thread.currentThread().getName() + ": 被中断了");
                   // 对中断标识位进行复位
                   Thread.interrupted();
                }
            }
        }
    }

}

在抛出InterruptException之前,虚拟机会将该线程的中断标识位清除。此时如果调用isInterrupt()方法会返回false。

public class Interruped {
    public static void main(String[] args) throws InterruptedException {
        Thread sleepRunner = new Thread(new SleepRunner(),"sleepThread");
        Thread busyRunner = new Thread(new BusyRunner(),"busyThread");
        
        sleepRunner.start();
        busyRunner.start();
        
        // 这个很重要,要先让线程跑起来
        TimeUnit.SECONDS.sleep(5);
        
        sleepRunner.interrupt();
        busyRunner.interrupt();
        
        System.out.println("sleepThread is" + sleepRunner.isInterrupted());
        System.out.println("busyThread is" + busyRunner.isInterrupted());
    }
    // 该类抛出中断异常
    static class SleepRunner implements Runnable{
        @Override
        public void run() {
            while(true){
                try {
                    Thread.sleep(10*1000);
                } catch (InterruptedException e) {
                }
            }
        }
    }

        // 该类不抛出异常
    static class BusyRunner implements Runnable{
        @Override
        public void run() {
            while(true){
            }
        }
    }
}

sleepThread is false // 抛出异常的线程中断标识位被清除
busyThread is true // 没有抛出异常的线程没有被清除


相关文章

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

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

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

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

  • 【多线程】——3.线程的中断

    线程中断的概念 java线程中断是一种协作机制 通过中断并不能直接终止线程的运行 需要被中断的线程自己处理中断 (...

  • 8.3 线程控制

    线程中断 方法:void interrupt():中断线程(本质没有中断操作,只是给线程对象加了个标记,设置其中断...

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

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

  • Java线程及多线程相关

    多线程 中断 每个线程都有一个boolean类型的中断状态。当在另一个线程中断该线程时,这个线程的中断状态将被设置...

  • (4)线程中断

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

  • 7 什么是线程中断

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

  • 线程中断

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

  • 线程方法

    1.实例方法t1.interrupt()中断线程 线程中断并不会立即使线程退出,告知目标线程中断(设置中断标识位,...

网友评论

      本文标题:线程中断

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