完成所有ExecutorService任务后,程序不会立即终止

我将一堆可运行的对象放入ExecutorService中:

// simplified content of main method

ExecutorService threadPool = Executors.newCachedThreadPool();

for(int i = 0; i < workerCount; i++) {

threadPool.execute(new Worker());

}

我希望我的程序/过程在所有工作人员完成后立即停止。但是根据我的日志,这种情况还需要20到30秒。工人没有分配任何资源,实际上,他们目前什么都不做。

不要误会我的意思,这对我来说不是一个关键问题,我只是想了解正在发生的事情,而且我想知道这是否是正常行为。

回答:

Executors.newCachedThreadPool()使用Executors.defaultThreadFactory()它的ThreadFactorydefaultThreadFactory的javadocs说“每个新线程都被创建

线程”(添加了重点)。因此,为所创建的线程newCachedThreadPool是非守护程序。这意味着它们将阻止JVM自然退出(通过“自然”,我是说您仍然可以调用System.exit(1)或杀死该程序以使JVM停止运行)。

应用程序完全结束的原因是,在newCachedThreadPool超时时间内创建的每个线程都会在一段时间不活动后自行关闭。当它们中的最后一个关闭时,如果您的应用程序中没有剩余的非守护线程,则它将退出。

您可以(并且应该)ExecutorService通过shutdown或手动关闭下拉菜单shutdownNow

另请参阅JavaDoc for

Thread,它讨论守护程序。

以上是 完成所有ExecutorService任务后,程序不会立即终止 的全部内容, 来源链接: utcz.com/qa/415003.html

回到顶部