【Java|多线程与高并发】线程的中断的两种方法

1.前言

线程中断是指在一个线程执行的过程中,强制终止该线程的执行。虽说是中断,但本质上是让run方法快点执行完,而不是run方法执行到一半,强制结束.
本文主要介绍线程中断的两种方法
在这里插入图片描述

2. 方法1: 自定义标志位

看下面这段代码:

public class Demo6 {
    private static boolean flag = false;
    public static void main(String[] args) {
        Thread t = new Thread(()->{
            while(!flag){
                System.out.println("线程执行中!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("线程执行完了!");
        });
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("设置标志位,让线程执行结束");
        flag = true;
    }
}

运行结果:
在这里插入图片描述
看下面这张图:
在这里插入图片描述
在这段代码中,定义了一个flag的标志位,在线程t中以标志位作为run方法的执行条件,每隔1s输出一次"线程执行中",再先让main线程(主线程)休眠3s,3s后main线程开始执行,输出"设置标志位,让线程执行结束",并修改flag变量的值为false,线程t不满足执行条件,因此线程t执行完毕.

3. 方法2:使用标准库自带的标志位

Java提供了一种中断线程的机制,即调用线程的interrupt()方法。
当一个线程被中断时,它会收到一个中断信号,但并不意味着线程会立即停止执行。线程可以通过检查自己的中断状态来决定是否停止执行。线程可以通过调用isInterrupted()方法来检查自己是否被中断。如果线程已经被中断,那么该方法返回true,否则返回false。

示例:

public class Demo7 {
    public static void main(String[] args) {
        Thread t = new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){
                System.out.println("线程执行中!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程执行完了!");
        });
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("设置标志位,让线程执行结束");
        t.interrupt();
    }
}

在这里插入图片描述
但是这么写,会有问题
在这里插入图片描述
能看到,这里抛出了一个异常.而且虽然设置标志位,但是线程并没有结束.
注意interrupt方法有两种行为:

  1. 如果线程是正常状态,会设置标志位为true
  2. 如果线程是阻塞状态(sleep),不会设置标志位,而是会触发一个InterruptedException这样的异常,这个异常会将sleep提前唤醒.由于我这里的catch中只是打印了日志,并没有结束循环,因此线程仍在执行中

如果想要结束循环,可以在catch中加上break
在这里插入图片描述

4.总结

线程中断机制是一种优雅的线程停止方式,可以避免线程无限期地等待某个条件而导致程序出现死锁或无响应的情况。但是,线程中断并不是强制终止线程的方法,它需要线程自己来判断是否停止执行。因此,在编写线程时,需要注意在适当的时候检查线程的中断状态并做出相应的处理。
在这里插入图片描述

感谢你的观看!希望这篇文章能帮到你!
专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!
“愿与君共勉,携手共进!”
在这里插入图片描述

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

比奇堡的天没有云

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

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

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

打赏作者

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

抵扣说明:

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

余额充值