Java并发编程-两阶段终止模式

目录名称

Two Phase Termination

在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个料理后事的机会。

错误思路

  1. 使用线程对象的 stop() 方法停止线程,该方法已被废弃

stop 方***真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁

  1. 使用 System.exit(int) 方法停止线程

目的仅是停止一个线程,但这种做***让整个程序都停止(整个java程序都会停止)

模式详解

alt


public class Test01 {
    public static void main(String[] args) throws InterruptedException {
        TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination();
        twoPhaseTermination.start();
        
        Thread.sleep(4000);
        //优雅的停止
        twoPhaseTermination.stop();
    }
}

class TwoPhaseTermination {
    //创建一个监控线程
    private Thread monitor;

    //启动监控线程
    public void start() {
        monitor = new Thread(() -> {
            while (true) {
                //拿到当前线程
                Thread current = Thread.currentThread();
                //监控是否被打断
                if (current.isInterrupted()) {
                    System.out.println("料理后事");
                    break;
                }
                try {
                    Thread.sleep(1000);             //睡眠中
                    //如果没有被打断,执行监控操作
                    System.out.println("执行监控操作");      //操作中
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    //在睡眠中被打断会进入到这里
                    //补充睡眠中被打断,线程的打断标记会置为false,所以需要设置打断标记
                    //再次循环监控的时候就会break
                    current.interrupt();
                }
            }
        });
        monitor.start();
    }

    //停止监控线程
    public void stop() {
        monitor.interrupt();
    }
}

不推荐使用方法

stop() 停止线程运行

suspend() 挂起(暂停)线程运行

resume() 恢复线程运行

全部评论

相关推荐

12-05 15:53
中南大学 Java
点赞 评论 收藏
分享
程序员小白条:投太少了,多投点吧,二本就海投,然后简历上加点奖项或者四六级之类的,别管有没有用,另外最好搞下个人博客,定期输出一些文章和学习总结,也可以去github参与一下开源项目提一些PR,总会有中小公司看的上的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务