当前位置: 首页 > news >正文

Java并发 | 13.[设计模式] 两阶段终止线程

文章目录

  • 1. 错误的终止线程方式
    • 错误①:直接用 t1.stop( ) 停止线程
    • 错误②:使用 System.exit( int ) 停止进程
  • 2. 更优雅的终止方式——两阶段终止模式
    • 2.1. 核心思想
    • 2.2. 如何实现?
  • 3. 代码示例
  • 参考资料

1. 错误的终止线程方式

错误①:直接用 t1.stop( ) 停止线程

该方法会直接杀死线程。

若在此之前线程锁住了共享资源,在它被杀死后就 再也没有机会将锁释放,其他线程将永远无法获取锁。

错误②:使用 System.exit( int ) 停止进程

该方法会直接 停止整个进程 …多少是有些滥杀无辜了。

2. 更优雅的终止方式——两阶段终止模式

2.1. 核心思想

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-49R8yGIR-1661879275561)(http://xyx-eshang.oss-cn-heyuan.aliyuncs.com/img/2022/08/30/2022:08:30-17:08:47:794)]

将终止线程拆分成两个阶段,给需要终止的线程一个 “料理后事” 的机会:

第一个阶段只是发出指令,第二个阶段则是目标线程针对发出的指令,先「料理完后事」,再自主停止线程。

2.2. 如何实现?

在真正执行操作之前,先判断该线程是否曾被打断(curThread.isInterrupted( )),一旦检测到被打断,则将当前锁住的所有资源释放,料理完所有后事后,自主停止线程。

需要注意,如果线程在休眠状态被打断,通常需要在 catch 代码块中将打断标记重新设为true,以确保下次能进入if代码块。

private static void test(){
    Thread t1 = new Thread(() -> {
        Thread curThread = Thread.currentThread();
        while (true){
            if (curThread.isInterrupted()){
                // 料理后事,释放资源...
                break;
            }
            // code here...
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
                // 重新将标识改为true
                curThread.interrupt();
            }
        }
    });
    t1.start();
    // code here...
    t1.interrupted();
}

当然,将 “料理后事” 的代码块抽离出来作为方法也是可以的,若休眠时被打断,直接调用该方法并终止也行,就像这样:

private static void releaseResource(){
    // 料理后事,释放资源...
}

private static void test(){
    Thread t1 = new Thread(() -> {
        Thread curThread = Thread.currentThread();
        while (true){
            if (curThread.isInterrupted()){
                releaseResource();
                break;
            }
            // code here...
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
                // 不改标识,直接调用方法也可以
                releaseResouece();
                break;
            }
        }        
    });
    t1.start();
    // code here...
    t1.interrupted();
}

3. 代码示例

image-20220830170045567

参考资料

[文章] Two Phase Termination 设计模式:两阶段终止模式

[视频] 03.028-设计模式-两阶段终止-interrupt

[视频] 03.029-设计模式-两阶段终止-interrupt-分析

[视频] 03.030-设计模式-两阶段终止-interrupt-实现

[视频] 03.031-设计模式-两阶段终止-interrupt-细节

相关文章:

  • 一次服务器被入侵的处理过程分享
  • Java并发 | 11.[方法] join( )和join( long m )等待线程执行完毕
  • es重启临时关闭自动分片
  • Git仓库4(分支操作冲突,标签管理)
  • camera特效app(安卓)
  • JAVA代码 企业人力资源管理系统(详细带截图) 毕业设计
  • Spring 事务
  • 海滩的海鸥
  • 医疗系统业务流程
  • 云计算-虚拟化
  • Vue学习之--------插槽【默认插槽、具名插槽、作用域插槽】(2022/8/30)
  • 医疗项目 01(项目简介)
  • 用npm 用jest测试
  • 版税激励错配下,创作者如何可持续地盈利?
  • 蓝桥杯实战应用【算法代码篇】-一题三解:计算二进制中1的个数(附Java和C++代码)
  • ES6指北【2】—— 箭头函数
  • JAVA SE 6 GC调优笔记
  • java正则表式的使用
  • JS+CSS实现数字滚动
  • Spring Boot快速入门(一):Hello Spring Boot
  • Vue.js源码(2):初探List Rendering
  • 包装类对象
  • 基于 Babel 的 npm 包最小化设置
  • 技术发展面试
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 入门到放弃node系列之Hello Word篇
  • 设计模式走一遍---观察者模式
  • Java性能优化之JVM GC(垃圾回收机制)
  • 积累各种好的链接
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #14vue3生成表单并跳转到外部地址的方式
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)Android开发优化---------UI优化
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C)一些题4
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (利用IDEA+Maven)定制属于自己的jar包
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十一)图像的罗伯特梯度锐化
  • (五)c52学习之旅-静态数码管
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • 、写入Shellcode到注册表上线
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET面试题(二)
  • .NET使用存储过程实现对数据库的增删改查
  • :=
  • @test注解_Spring 自定义注解你了解过吗?
  • @取消转义
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析