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();
    }
}
相关推荐
2401_833269302 小时前
Java网络编程入门
java·开发语言
金銀銅鐵3 小时前
[Java] 如何将 Lambda 表达式对应的类保存到 class 文件中?
java·后端
それども3 小时前
Gradle 构建疑难杂症 Could not find netty-transport-native-epoll-linux-aarch_64.ja
java·服务器·gradle·maven
正儿八经的少年4 小时前
application.yml 系列配置文件作用与区别
java·配置文件
鱼很腾apoc4 小时前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
cheems95275 小时前
[Spring MVC] 统一功能与拦截器实践总结
java·spring·mvc
Full Stack Developme5 小时前
Spring Boot 事务管理完整教程
java·数据库·spring boot
城管不管6 小时前
前后端远程协作
java
青云计划6 小时前
Feed流
java·后端·spring
java1234_小锋6 小时前
String、StringBuilder、StringBuffer的区别?
java·开发语言