可能最简单和首选的解决方案是在Marco13的答案中,所以不要被投票差异(这个答案早了几年)或接受标记所愚弄(它只是意味着这个解决方案适合OP情况,而不是一般来说它是最好的)。
您可以使用 将执行程序中的线程设置为守护程序。这将以某种方式影响执行程序服务,因为它也将成为守护程序线程,因此,如果没有其他非守护程序线程,它将停止(以及由它处理的线程)。下面是一个简单的示例:ThreadFactory
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);
但是,如果您想获得执行器,这将使其任务完成,同时在应用程序完成时自动调用其方法,则可能需要使用Guava的MoreExecutors.getExitingExecutorService
包装执行器。shutdown()
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();
}
}
});