完成所有ExecutorService任务后,程序不会立即终止
我将一堆可运行的对象放入ExecutorService中:
// simplified content of main methodExecutorService threadPool = Executors.newCachedThreadPool();
for(int i = 0; i < workerCount; i++) {
threadPool.execute(new Worker());
}
我希望我的程序/过程在所有工作人员完成后立即停止。但是根据我的日志,这种情况还需要20到30秒。工人没有分配任何资源,实际上,他们目前什么都不做。
不要误会我的意思,这对我来说不是一个关键问题,我只是想了解正在发生的事情,而且我想知道这是否是正常行为。
回答:
Executors.newCachedThreadPool()
使用Executors.defaultThreadFactory()
它的ThreadFactory
。defaultThreadFactory
的javadocs说“每个新线程都被创建
线程”(添加了重点)。因此,为所创建的线程newCachedThreadPool
是非守护程序。这意味着它们将阻止JVM自然退出(通过“自然”,我是说您仍然可以调用System.exit(1)
或杀死该程序以使JVM停止运行)。
应用程序完全结束的原因是,在newCachedThreadPool
超时时间内创建的每个线程都会在一段时间不活动后自行关闭。当它们中的最后一个关闭时,如果您的应用程序中没有剩余的非守护线程,则它将退出。
您可以(并且应该)ExecutorService
通过shutdown
或手动关闭下拉菜单shutdownNow
。
另请参阅JavaDoc for
Thread,它讨论守护程序。
以上是 完成所有ExecutorService任务后,程序不会立即终止 的全部内容, 来源链接: utcz.com/qa/415003.html