我把一堆可运行的对象放到一个 ExecutorService 中:
// simplified content of main method
ExecutorService threadPool = Executors.newCachedThreadPool();
for(int i = 0; i < workerCount; i++) {
threadPool.execute(new Worker());
}
我希望我的程序/进程在所有工作人员完成后立即停止。但根据我的日志,这还需要 20-30 秒。 worker 没有分配任何资源,事实上,他们现在什么都不做。
不要误会,这对我来说不是一个关键问题,我只是想了解正在发生的事情,我想知道这是否是正常行为。
最佳答案
Executors.newCachedThreadPool()
使用 Executors.defaultThreadFactory()
对于它的 ThreadFactory
。 defaultThreadFactory
的 javadocs 说“每个新线程都被创建为 非守护进程 线程”(强调)。因此,为 newCachedThreadPool
创建的线程是非守护进程。这意味着它们将阻止 JVM 自然退出(“自然”是指您仍然可以调用 System.exit(1)
或终止程序以导致 JVM 停止)。
应用程序完成的原因是 newCachedThreadPool
中创建的每个线程都会超时并在一段时间不活动后自行关闭。当它们中的最后一个自行关闭时,如果您的应用程序没有任何非守护线程,它将退出。
您可以(并且应该)通过 shutdown
手动关闭 ExecutorService
或 shutdownNow
。
另见 Thread 的 JavaDoc ,它谈到了守护进程。
关于java - 所有 ExecutorService 任务完成后程序不会立即终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20057497/