java多线程 (5) -- Java线程两阶段终止模式

Java线程两阶段终止模式

主要目的是安全的优雅的停止线程,因为Thread中的stop非常的暴力不安全,因为它会不管线程执行到哪里,都会马上停止,不能保证安全的结束。

interrupt和isInterrupted

interrupt和isInterrupted在上面文章有详细的说明
java多线程(4)–interrupt()、interrupted()和isInterrupted()

这里简单说一下 interrupt 能给线程打上一个中断标记true ( 当线程处于睡眠阻塞状态时会失败并报出会InterruptedException),isInterrupted方法能去获取这个标记 返回true或者false
既然我们能打上标识,获取标识那么我们就可以在线程中做判断 如果标识为true就停止当前线程
在这里插入图片描述

public class Test1 {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        // 启动线程
        myThread.start();
        // 等待5秒
        TimeUnit.SECONDS.sleep(5);
        // 停止线程
        myThread.stop();
    }
}

class MyThread {
    private Thread t1;
    void start() {
        t1 = new Thread(() -> {
            while (true) {
                try {
                    boolean isInterrupted = Thread.currentThread().isInterrupted();
                    if (isInterrupted) {
                        // 这里可以做很多 线程停止前的操作
                        log.debug("线程停止!!!!");
                        break;
                    }
                    log.debug("线程运行中");
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    /* 如果线程处于等待状态 调用  t1.interrupt() 会
                    InterruptedException 异常 把打断标识重置为 false*/
                     e.printStackTrace();
                    // 重新调用interrupt打上停止断点
                    Thread.currentThread().interrupt();
                }
            }
        }, "t1线程");
        t1.start();
    }
    
    void stop() {
        t1.interrupt();
        log.debug("~~~开始停止线程~~~");
    }
}

在这里插入图片描述

我们通过interrupt打上中断标识,isInterrupted获取标识就安全的把线程停下来了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值