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();
    }
}
相关推荐
正在努力Coding3 小时前
SpringAI - 工具调用
java·spring·ai
我尽力学3 小时前
面试 总结
java·spring boot·面试
爬台阶的蚂蚁3 小时前
Spring AI Alibaba基础概念
java·spring·ai
计算机学姐4 小时前
基于SpringBoot的演唱会抢票系统
java·spring boot·后端·spring·tomcat·intellij-idea·推荐算法
huohuopro4 小时前
Mybatis的七种传参方式
java·开发语言·mybatis
Lee_SmallNorth4 小时前
变态需求之【角色不同访问数据库的用户不同】
java·开发语言·数据库
扶苏-su4 小时前
Java网络编程:InetAddress 详解
java·开发语言·网络
Anastasiozzzz4 小时前
leetcode力扣hot100困难题--4.俩个正序数列的中位数
java·算法·leetcode·面试·职场和发展
木风小助理4 小时前
JavaStreamAPI的性能审视,优雅语法背后的隐形成本与优化实践
java·前端·数据库
Chan164 小时前
《Java并发编程的艺术》| ConcurrentHashMap 在 JDK 1.7 与 1.8 的底层实现
java·spring boot·java-ee·intellij-idea·juc