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();
    }
}
相关推荐
MiNG MENS几秒前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
是码龙不是码农2 分钟前
synchronized 底层原理深度详解
java·synchronized
邂逅星河浪漫3 分钟前
【Java】@EqualsAndHashCode 注解解析
java·开发语言
StackNoOverflow8 分钟前
Spring Data Redis 详解
java·redis·spring
2401_840192279 分钟前
数据库连接池和java servlet
java·数据库·servlet
OtIo TALL11 分钟前
Spring Boot管理用户数据
java·spring boot·后端
小碗羊肉17 分钟前
【从零开始学Java | 第二十五篇】Set集合
java·开发语言
Seven9718 分钟前
用300行代码手写Spring核心原理
java
小垣19 分钟前
java调用yolo26n.onnx模型输出图像推理检测
java·人工智能·深度学习·onnx
8Qi819 分钟前
微服务通信:同步 vs 异步与MQ选型指南
java·分布式·微服务·云原生·中间件·架构·rabbitmq