在实用程序库中,我正在创建ExecutorService
ExecutorService es = Executors.newSingleThreadExecutor();
主线程然后会将一些任务发布到此ExecutorService。当主线程完成时,我想关闭ExecutorService以允许应用程序退出。
问题是我只能更改实用程序库中的代码。我考虑过的一个选择是使用守护进程线程。但是,在发布到服务的任务完成之前,它会突然关闭。
答案 0 :(得分:5)
使用Runtime#addShutdownHook()
向当前运行时添加关闭挂钩。
E.g。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
es.shutdown();
try {
es.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
logger.info("during await",e);
}
}
});
在构建/初始化实用程序类时执行此操作。
答案 1 :(得分:3)
shutdownHook
将无效。这就是原因
shutdownhook
在JVM开始退出时启动,JVM将不会退出,除非您调用es.shutDown()
使其陷入僵局。
我不知道为什么让守护进程执行器不起作用。这应该。在主类启动的所有线程完成执行之前,守护程序执行程序不会关闭(除非它们也是守护程序)
在创建执行程序时尝试此代码
ExecutorService es = Executors.newSingleThreadExecutor( new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
});