为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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步