在实用程序库我创建的ExecutorService关闭ExecutorService的优雅当主线程完成
ExecutorService es = Executors.newSingleThreadExecutor();
主线程会再发布一些任务,此ExecutorService。当主线程完成时,我想关闭ExecutorService以允许应用程序退出。
问题是我只能更改实用程序库中的代码。我考虑的一个选择是使用守护进程线程。但是,在发布到服务的任务完成之前,它会突然关闭。
在实用程序库我创建的ExecutorService关闭ExecutorService的优雅当主线程完成
ExecutorService es = Executors.newSingleThreadExecutor();
主线程会再发布一些任务,此ExecutorService。当主线程完成时,我想关闭ExecutorService以允许应用程序退出。
问题是我只能更改实用程序库中的代码。我考虑的一个选择是使用守护进程线程。但是,在发布到服务的任务完成之前,它会突然关闭。
使用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);
}
}
});
在您的工具类的构建/初始化时执行此操作。
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;
}
});
几乎工作时,后台程序执行不关机,直到主类的所有主题执行完毕(除非它们也守护进程)
试试这个代码。 :)如果主线程足够好,可以调用System.exit(0);在执行结束时。然而,这个库的用户不能被信任那么做:( –
)如果最终用户不想要优雅地关闭,那么没有任何可以做的事。例如微软知道这个很好。最好你可以做的是保存一些有关[user prefs](http://docs.oracle.com/javase/7/docs/api/java/util/prefs/Preferences.html)中某处进程的信息,然后在程序再次启动时查找它,然后最终通知用户,如“在上次运行期间程序似乎已经意外结束,这里有一些未完成的进程[...]你想重新运行它们吗?”等等。 – BalusC
也许有一些方法可以知道主线程没有什么可执行的了? –