我正在 Java 1.6 中使用 ExecutoreService,只需通过以下方式启动
ExecutorService pool = Executors.newFixedThreadPool(THREADS).
当我的主线程完成(以及线程池处理的所有任务)时,该池将阻止我的程序关闭,直到我显式调用
pool.shutdown();
我可以通过某种方式将该池使用的内部线程管理转换为守护线程来避免调用它吗?或者我在这里遗漏了一些东西。
可能最简单且首选的解决方案是马可13的回答所以不要被投票差异(这个答案早了几年)或接受标记所愚弄(这只是意味着这个解决方案适合OP情况,而不是一般来说它是最好的)。
您可以使用ThreadFactory
将 Executor 内的线程设置为守护进程。这将以某种方式影响执行程序服务,它也将成为守护线程,因此如果没有其他非守护线程,它(以及它处理的线程)将停止。这是一个简单的例子:
ExecutorService exec = Executors.newFixedThreadPool(4,
new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setDaemon(true);
return t;
}
});
exec.execute(YourTaskNowWillBeDaemon);
但是如果你想得到执行器,让它完成任务,同时自动调用它的shutdown()
方法当应用程序完成时,您可能需要用以下内容包装您的执行器Guava's MoreExecutors.getExitingExecutorService.
ExecutorService exec = MoreExecutors.getExitingExecutorService(
(ThreadPoolExecutor) Executors.newFixedThreadPool(4),
100_000, TimeUnit.DAYS//period after which executor will be automatically closed
//I assume that 100_000 days is enough to simulate infinity
);
//exec.execute(YourTask);
exec.execute(() -> {
for (int i = 0; i < 3; i++) {
System.out.println("daemon");
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)