千家信息网

java两阶段终止线程怎么实现

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要讲解了"java两阶段终止线程怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java两阶段终止线程怎么实现"吧!一、怎么优雅地关闭
千家信息网最后更新 2025年01月18日java两阶段终止线程怎么实现

这篇文章主要讲解了"java两阶段终止线程怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java两阶段终止线程怎么实现"吧!

    一、怎么优雅地关闭一个线程?

    在一个线程T1中如何优雅地关闭线程T2(也就是说要给T2一个机会释放持有的资源)?

    1.错误做法

    使用stop()方法停止线程:

    stop()方法会真正杀死线程,如果此时该线程持有锁,那么其他线程将永远无法获取锁。

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

    会让整个进程都退出

    2.正确做法

    思路:

    代码实现:

    public class Test {    public static void main(String[] args) throws InterruptedException {        TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination();        twoPhaseTermination.start();        Thread.sleep(3000);        twoPhaseTermination.stop();    }}class TwoPhaseTermination{    // 监控线程    private Thread monitorThread;    public void start(){        monitorThread = new Thread(()->{            Thread current = Thread.currentThread();            while(true){                if(current.isInterrupted()){                    System.out.println("线程要关闭了...");                    break;                }                try {                    Thread.sleep(1000); // 阶段1                    System.out.println("监控线程正在工作...."); // 阶段2                     // 如果在阶段2被打断,线程的isInterrupted标志位为true,会捕抓到信号并关闭线程                     // 如果在阶段1被打断,会进入catch语句块,并且isInterrupted标志位清空,无法关闭线程                } catch (InterruptedException e) {                    e.printStackTrace();                    // 需要重新设置isInterrupted标志位为true                    monitorThread.interrupt();                }            }        });        // 启动线程        monitorThread.start();    }    public void stop(){        // 设置isInterrupted标志位true        monitorThread.interrupt();    }}

    运行结果:

    两阶段关闭线程:

    二、要点

    为什么需要在catch代码块中重新执行monitorThread.interrupt()?因为Thread.sleep()执行过程中被打断,isInterrupted标志位会清空,下一次进入while循环就会忽略这次打断,继续运行线程。

    演示一下把monitorThread.interrupt()注释掉的结果:

    可以看到,会忽略这次的isInterrupted信号,继续运行线程。

    感谢各位的阅读,以上就是"java两阶段终止线程怎么实现"的内容了,经过本文的学习后,相信大家对java两阶段终止线程怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

    线程 阶段 标志 方法 学习 运行 优雅 代码 信号 做法 内容 思路 结果 监控 也就是 也就是说 就是 情况 文章 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 2008r2服务器管理器 北京宏景捷讯网络技术股份 云南综合软件开发市场报价 数据库技术与程序设计重点 机场的无线网络技术 长沙随笔记网络技术有限公司 服务器电机怎么选择 全球网络安全与信息化论坛 福州高端云控软件开发商 网络安全自查报告必须写吗 香港服务器租用恒创科技信赖 我的世界租服务器如何安装mod 西桥服务器加油站电话 湛江网络安全宣传周 数据库 导出表数据 网安大队进企业开展网络安全宣传 软件开发法律风险及解决办法 曲靖服务器租用加盟 三年级上册网络安全手抄报大全 网络安全技术等级划分 生产服务器该设置多少带宽 选择题的数据库设计 服务器优盘引导只显示uffi 计算机网络技术在校赚钱 电视机怎么连接云端服务器 内江社区网络安全宣传 网络安全保卫工作心得 三级嵌入式与网络技术 渠道服的服务器一样吗 网络安全华为培训
    0