java多线程设计模式(一)两阶段终止模式

基于白嫖黑马程序员白嫖视频:全面深入学习java并发编程,java基础进阶中级必会教程

1 场景

在T1线程中如何“优雅”终止线程T2。

2 流程图

两阶段终止模式

3 实现1

Thread thread = new Thread() {
    @Override
    public void run() {
        //持续运行
        while (true) {
            //被打断
            Thread current = Thread.currentThread();
            if (current.isInterrupted()) {
                System.out.println("料理后事");
                break;
            }
            //没有被打断
            try {
                Thread.sleep(1000);//sleep让出cpu时间
                System.out.println("正常执行任务");
            } catch (InterruptedException e) {
                //对于sleep时被打断会捕捉这个异常,自己改变isInterrupted为true
                current.interrupt();
            }
        }
    }
};

4 实现2(volatile)

//设置一个退出的变量
private static volatile boolean stop = false;//是否退出,注意关键字volatile

public static void main(String[] args) {
    Thread thread = new Thread() {
        @Override
        public void run() {
            //持续运行
            while (true) {
                //被打断
                Thread current = Thread.currentThread();
                if (stop) {
                    System.out.println("料理后事");
                    break;
                }
                //没有被打断
                try {
                    Thread.sleep(1000);//sleep让出cpu时间
                    System.out.println("正常执行任务");
                } catch (InterruptedException e) {
                    //对于sleep时被打断会捕捉这个异常,自己改变isInterrupted为true
                    current.interrupt();
                }
            }
        }
    };
}

实现1有两种退出出口,即在不同的位置调用interrupt()。但是实现2别人调用只用设置stop布尔值变量即可实现退出,其实原理一样,只是实现2没有在sleep打断的这一种情况,鲁棒性较好。

5 总结

所谓的两阶段终止,指的是可能在sleep阶段被终止和可能在执行任务期间被终止;对于执行任务期间,isInterrupted被设置为true,下一次循环的时候就执行“料理后事”代码;对于sleep期间被终止,马上进入catch块,但是isInterrupted还是false,需要自己执行一次中断操作current.interrupt()。


版权声明:本文为weixin_44215363原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。