zoukankan      html  css  js  c++  java
  • 为ExecutorService增加shutdown hook

    public class ShutdownHook {
        private static final ShutdownHook INSTANCE = new ShutdownHook();
    
        private List<ExecutorService> executorServices = Lists.newArrayList();
        private AtomicBoolean closed = new AtomicBoolean(false);
    
        public static ShutdownHook getInstance() {
            return INSTANCE;
        }
    
        private ShutdownHook() {
            Runtime.getRuntime().addShutdownHook(new Thread() {
                @Override
                public void run() {
                    shutdown();
                }
            });
        }
    
        @PreDestroy
        public void shutdown() {
            if (!closed.compareAndSet(false, true)) {
                return;
            }
            for (ExecutorService executorService : executorServices) {
                tryShutdownNow(executorService);
            }
        }
    
        private void tryShutdownNow(ExecutorService executorService) {
            try {
                executorService.shutdownNow();
            } catch (Throwable e) {
                //ignore logger maybe has been destroyed
            }
    
            try {
                executorService.awaitTermination(1, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                //ignore logger maybe has been destroyed
            }
        }
    
        /**
         * 注册executorService
         *
         * @param executorService
         */
        public ExecutorService register(ExecutorService executorService) {
            this.executorServices.add(executorService);
            return executorService;
        }
    }
  • 相关阅读:
    最精简的django程序
    spring+mongo
    从零搭建mongo分片集群的简洁方法
    java对redis的基本操作
    awk输出指定列
    sed输出指定行
    Bash的循环结构(for和while)
    用ffmpeg切割音频文件
    Python判断字符串是否全是字母或数字
    Python函数: any()和all()的用法
  • 原文地址:https://www.cnblogs.com/frankyou/p/9983301.html
Copyright © 2011-2022 走看看