8.设计模式-两阶段终止(优雅停机)

优雅停机

应用程序停止之前,内部的线程如果有业务正在执行,如何优雅的关闭。

  • 要终止一个线程,不要直接stop(),因为这个线程可能还有事情没有完成,比如还有锁没有释放
  • 也不要System.exit(), 因为这样直接结束进程了
  • stop方法已经过时了

使用interrupt方法实现

java 复制代码
@Slf4j(topic = "c.c.e.d.Monitor")
public class Monitor {

    Thread thread;

    public void start() {
        thread = new Thread(() -> {
            while (true) {
                Thread currentThread = Thread.currentThread();

                // 执行业务逻辑之前先检查下打断标记,若被打断了,则停止线程,清理资源
                if (currentThread.isInterrupted()) {
                	// 在这里可以做一些清理资源的工作
                    log.debug("线程被打断了,停止");
                    break;
                }
                try {
                    log.debug("执行业务逻辑。。");
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    // 若线程在sleep的时候被打断,则会抛出异常,此时打断标记还是false
                    // 可以手动设置为true,这样下次循环的时候,就会停止
                    currentThread.interrupt();
                }
            }
        });

        thread.start();
    }

    public void stop() {
        thread.interrupt();
    }
}
相关推荐
leoufung17 小时前
LeetCode 373. Find K Pairs with Smallest Sums:从暴力到堆优化的完整思路与踩坑
java·算法·leetcode
阿蒙Amon17 小时前
C#每日面试题-委托和事件的区别
java·开发语言·c#
宋情写17 小时前
java-IDEA
java·ide·intellij-idea
最贪吃的虎17 小时前
Git: rebase vs merge
java·运维·git·后端·mysql
资生算法程序员_畅想家_剑魔18 小时前
Java常见技术分享-12-多线程安全-锁机制
java·开发语言
一叶飘零_sweeeet18 小时前
吃透 Spring 体系结构
java·spring
2401_8370885018 小时前
简要总结 HashSet 和 HashMap(Java)
java·开发语言
毕设源码-钟学长18 小时前
【开题答辩全过程】以 基于Java的家政服务管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
小白学大数据18 小时前
Java 爬虫对百科词条分类信息的抓取与处理
java·开发语言·爬虫
Coder_Boy_19 小时前
Spring 核心思想与企业级最佳特性(实践级)事务相关
java·数据库·spring