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

Java线程两阶段终止模式

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

interrupt和isInterrupted

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

这里简单说一下 interrupt 能给线程打上一个中断标记true ( 当线程处于睡眠阻塞状态时会失败并报出会InterruptedException),isInterrupted方法能去获取这个标记 返回true或者false
既然我们能打上标识,获取标识那么我们就可以在线程中做判断 如果标识为true就停止当前线程
java多线程 (5) -- Java线程两阶段终止模式_第1张图片

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("~~~开始停止线程~~~");
    }
}

java多线程 (5) -- Java线程两阶段终止模式_第2张图片

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

你可能感兴趣的:(笔记,java,多线程)