线程中断:interrupt

多线程系列文章目录


在这里插入图片描述

💥 💥 💥如果你觉得我的文章有帮助到你,还请【关注➕点赞➕收藏】,得到你们支持就是我最大的动力!!!
💥 💥 💥

版权声明:本文由【马上回来了】原创、在优快云首发、需要转载请联系博主。
版权声明:本文为优快云博主「马上回来了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

在这里插入图片描述

🚀🚀🚀 新的知识开始喽🚀🚀🚀
在这里插入图片描述


1.线程中断

在创建一个了线程对象后,调用start方法时,会在操作系统内核里正真创建一个线程(PCB),此时,会执行程序员重写的run方法里的任务,当run方法执行完之后线程也就销毁了。
而线程中断本质上就是让run方法尽快结束,而不是run方法执行到一半强制结束,而如何中断线程就取决于run方法里的实现逻辑。

2.自定义标志位中断线程

先看一段线程死循环不结束的代码:

 public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run() {
                while (true){//这里永真,死循环,t线程一直在执行

                }
            }
        };
        t.start();
    }

运行结果:
在这里插入图片描述

自定义标志位将while循环进行终止:

public volatile static boolean Q = false;//定义一个全局的静态变量,用volatile修饰防止Q修改太慢导致的出现内存可见性问题
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(){
            @Override
            public void run() {
                while(!Q){//!Q为true,在未修改Q之前while将会一直循环

                }
                System.out.println("t线程结束");
            }
        };
        t.start();//启动线程
        System.out.println("t线程执行2s后结束");
        Thread.sleep(2000);//main线程先休眠2s在修改Q为true终止循环
        Q = true;
    }

运行结果:
在这里插入图片描述

3.使用标准库里提供的interrupt方法

1.线程不在休眠的状态下,即run方法里没有sleep函数:

 public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run() {
                while (!Thread.currentThread().isInterrupted()){

                }
                System.out.println("t线程结束");
            }
        };
        t.start();
        t.interrupt();//while循环里的结果变为false,run执行完打印函数后线程结束
    }

在这里插入图片描述
2.线程在休眠的状态下:
2.1 如果catch里不加break,则线程不会中断,只会打印日志

 public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run() {
                while (!Thread.currentThread().isInterrupted()){
                    System.out.println("t线程在执行");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("t线程结束");
            }
        };
        t.start();
        System.out.println("设置让t线程结束");
        t.interrupt();
    }


在这里插入图片描述
运行结果:

在这里插入图片描述
2.2 catch里加break可中断线程:
触发异常后立即中断线程:

 public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run() {
                while (!Thread.currentThread().isInterrupted()){
                    System.out.println("t线程在执行");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        break;//这里直接break,会立即中断线程
                    }
                }
                System.out.println("t线程结束");
            }
        };
        t.start();
        System.out.println("设置让t线程结束");
        t.interrupt();
    }

运行结果:
在这里插入图片描述

触发异常后,休眠一会儿在中断线程:

 public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run() {
                while (!Thread.currentThread().isInterrupted()){
                    System.out.println("t线程在执行");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();//这里会在触发异常五秒后在中断线程
                        }
                        break;
                    }
                }
                System.out.println("t线程结束");
            }
        };
        t.start();
        System.out.println("设置让t线程结束");
        t.interrupt();
    }

在这里插入图片描述



🌏🌏🌏今天的你看懂这里又学到了很多东西吧🌏🌏🌏

在这里插入图片描述

🌔 🌔 🌔下次见喽🌔 🌔 🌔
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马上回来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值