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();
    }
}
相关推荐
菜鸟plus+2 小时前
Captcha
java·开发语言
聪明的笨猪猪2 小时前
Java 高并发多线程 “基础”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
惬意小西瓜3 小时前
3.java常用类知识点
java·开发语言·分类
YA3333 小时前
java设计模式五、适配器模式
java·设计模式·适配器模式
拂晓银砾3 小时前
EasyExcel 动态多级标题、合并单元格、修改单元格样式实现总结
java
玩毛线的包子3 小时前
Android Gradle学习(十)- java字节码指令集解读
java
华农第一蒟蒻3 小时前
谈谈跨域问题
java·后端·nginx·安全·okhttp·c5全栈
菜鸟plus+3 小时前
MinIO
java
艾菜籽4 小时前
JVM中的垃圾回收机制
java·jvm