前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两阶段终止模式

两阶段终止模式

作者头像
废江_小江
发布2022-09-05 14:05:12
5470
发布2022-09-05 14:05:12
举报
文章被收录于专栏:总栏目

介绍

话不多说,先看图理解

为什么

为什么,需要这个模式呢?存在的意义是什么?

作用是优雅的停止一个线程,让其有“料理后事”的功能。有人会说,我用stop()方法,不是一样可以停止这个线程吗?这是不可行的,因为会直接正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁。所以,两阶段终止模式就来啦!

是什么

这个模式主要就是基于线程中的打断方法interrupt():如果打断的是sleep,wait,join,则会导致该线程抛出打断异常,并清楚打断标记。如果打断这在运行的线程,则会设置打断标记为true。这个两阶段也正是指该线程处于的两种阶段,一种是正常运行,一种是sleep等阻塞状态。

isinterrupted()判断当前线程是否被打断,不会清楚打断标记
interupted()判断当前线程是否被打断,会清楚打断标记(不常用)

ok,通过上面这两个方法,就可以实现,让线程自己去优雅的停止。

代码

代码语言:javascript
复制
@Slf4j(topic = "c.TPTInterrupt")
class TPTInterrupt {
    private Thread thread;
 
    public void start(){
        thread = new Thread(() -> {
            while(true) {
                Thread current = Thread.currentThread();
                if(current.isInterrupted()) {
                    log.debug("料理后事");
                    break;
                }
                try {
                    //对应两阶段,该线程处于sleep等状态,被打断,打断标记为false,抛出异常,再次打断,标记为true
                    Thread.sleep(1000);
                    //该线程处于正常运行状态,被打断,则打断标记为true,
                    log.debug("将结果保存");
                } catch (InterruptedException e) {
                    current.interrupt();
                }
 
            }
        },"监控线程");
        thread.start();
    }
 
    public void stop() {
        thread.interrupt();
    }
}

调用

代码语言:javascript
复制
TPTInterrupt t = new TPTInterrupt();
t.start();
Thread.sleep(3500);
log.debug("stop");
t.stop();

结果

代码语言:javascript
复制
11:49:42.915 c.TwoPhaseTermination [监控线程] - 将结果保存
11:49:43.919 c.TwoPhaseTermination [监控线程] - 将结果保存
11:49:44.919 c.TwoPhaseTermination [监控线程] - 将结果保存
11:49:45.413 c.TestTwoPhaseTermination [main] - stop 
11:49:45.413 c.TwoPhaseTermination [监控线程] - 料理后事

废江博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 转载请注明原文链接:两阶段终止模式

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 为什么
      • 是什么
        • isinterrupted()判断当前线程是否被打断,不会清楚打断标记
        • interupted()判断当前线程是否被打断,会清楚打断标记(不常用)
    • 代码
      • 调用
        • 结果
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档