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();
    }
}
相关推荐
小熊美家熊猫系统39 分钟前
电子合同技术实现与合规实践
java·开发语言·分布式
云烟成雨TD39 分钟前
Agent Scope Java 2.x 系列【3】从零构建 ReActAgent
java·人工智能·agent
一只叫煤球的猫1 小时前
ThreadForge 源码解读二:一个 Task 从 submit 到完成,内部到底发生了什么?
java·后端·面试
阿狸猿1 小时前
论微服务架构及其应用
java·微服务·架构
程序员黑豆2 小时前
Java中的字符串【AI全栈开发】
java
namexingyun2 小时前
开源前端生态如何成为 AI UI 生成的“燃料“:shadcn/ui、Tailwind CSS、Storybook 技术价值全解剖
java·前端·人工智能·python·ui·开源·ai编程
终将老去的穷苦程序员2 小时前
基于SpringBoot的餐饮管理系统
java·spring boot·后端
心之伊始2 小时前
Spring AI Tool Calling 实战:让 Java Agent 调用本地 Bean 工具方法
java·spring boot·agent·spring ai·tool calling
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第110题】【并发篇】第10题:CAS 存在哪些问题?
java·开发语言·面试
瀚高PG实验室3 小时前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库