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

标签 java multithreading concurrency executorservice

我把一堆可运行的对象放到一个 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()对于它的 ThreadFactorydefaultThreadFactory 的 javadocs 说“每个新线程都被创建为 非守护进程 线程”(强调)。因此,为 newCachedThreadPool 创建的线程是非守护进程。这意味着它们将阻止 JVM 自然退出(“自然”是指您仍然可以调用 System.exit(1) 或终止程序以导致 JVM 停止)。

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

您可以(并且应该)通过 shutdown 手动关闭 ExecutorServiceshutdownNow

另见 Thread 的 JavaDoc ,它谈到了守护进程。

关于java - 所有 ExecutorService 任务完成后程序不会立即终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20057497/

相关文章:

java - 这个引用转义单线程程序

java - 如何创建一个对象,将其设置为与另一个对象完全相同,并修改它而不影响循环内的旧对象?

c++ - 如何从另一个线程调用flutter引擎方法

python - 在两个线程进程之间访问数据

python - BasicHTTPServer、SimpleHTTPServer 和并发

java - 在java中同步一个对象,然后更改同步变量的值

java - 使用可变参数重载方法的行为

java - 在 1 个 ImageButton 上同时使用 OnTouchListener 和 OnClickListener

java - JVM 线程是否始终保持它们到 OS 线程的映射

Ruby Redis - 线程性能