线程中断方法详解interrupt

简介: 线程中断方法详解interrupt

线程中断方法详解interrupt

由于stop中断线程方法过于暴力,就像是突然你正在开发,突然停电一样

于是衍生出中断方法interrupt

简介

线程中断并不会使线程立即退出,而是给线程发送一个通知,告知目标线程,有人希望你退出了!至于目标线程接收到通知之后如何处理,则完全由目标线程自己决定

Thread提供了3个与线程中断有关的方法,这3个方法容易混淆,大家注意下:

public void interrupt() //中断线程
public boolean isInterrupted() //判断线程是否被中断
public static boolean interrupted()  //判断线程是否被中断,并清除当前中断状态

例子

public static void main(String[] args) throws InterruptedException {
   
    Thread thread1 = new Thread() {
   
        @Override
        public void run() {
   
            while (true) {
   
                //休眠100秒
                try {
   
                    TimeUnit.SECONDS.sleep(100);
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                }
                System.out.println("我要退出了");
                break;
            }
        }
    };
    thread1.setName("thread1");
    thread1.start();
    TimeUnit.SECONDS.sleep(1);
    thread1.interrupt();
}

调用interrupt()方法之后,线程的sleep方法将会抛出InterruptedException异常。

Thread thread1 = new Thread() {
   
    @Override
    public void run() {
   
        while (true) {
   
            //休眠100秒
            try {
   
                TimeUnit.SECONDS.sleep(100);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
            if (this.isInterrupted()) {
   
                System.out.println("我要退出了!");
                break;
            }
        }
    }
};

运行上面的代码,发现程序无法终止。为什么?

代码需要改为:

Thread thread1 = new Thread() {
   
    @Override
    public void run() {
   
        while (true) {
   
            //休眠100秒
            try {
   
                TimeUnit.SECONDS.sleep(100);
            } catch (InterruptedException e) {
   
                this.interrupt();
                e.printStackTrace();
            }
            if (this.isInterrupted()) {
   
                System.out.println("我要退出了!");
                break;
            }
        }
    }
};

上面代码可以终止。

注意:sleep方法由于中断而抛出异常之后,线程的中断标志会被清除(置为false),所以在异常中需要执行this.interrupt()方法,将中断标志位置为true

目录
相关文章
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
Java 测试技术
血的教训--如何正确使用线程池submit和execute方法
血的教训--如何正确使用线程池submit和execute方法
26 1
|
1月前
|
Java API 调度
线程的中断(interrupt)机制
线程的中断(interrupt)机制
30 1
|
2月前
|
人工智能 Java API
Python 潮流周刊#28:两种线程池、四种优化程序的方法
Python 潮流周刊#28:两种线程池、四种优化程序的方法
23 1
|
3月前
|
监控 Java 应用服务中间件
剑指JUC原理-3.线程常用方法及状态(下)
剑指JUC原理-3.线程常用方法及状态
59 0
|
3月前
|
安全 Java Kotlin
面试必备:Kotlin 线程同步的 N 种方法
面试必备:Kotlin 线程同步的 N 种方法
83 0
|
4月前
|
Java
学习多线程之yield方法
学习多线程之yield方法
43 0
|
5月前
|
监控 安全 算法
Thread入门与线程方法详解及多线程安全
Thread入门与线程方法详解及多线程安全
21 0
|
8天前
使用代理IP池实现多线程的方法
使用代理IP池实现多线程的方法
|
28天前
|
Java 测试技术 Python
Python开启线程和线程池的方法
Python开启线程和线程池的方法
17 0
Python开启线程和线程池的方法