如果我在 java 中声明 ExecutorService 后错过关闭子句会发生什么

what will happen if I miss shutdown clause after declaring ExecutorService in java

目前我正在使用 ExecutorService class 和 Java 中的 newFixedThreadPool 命令处理线程作业。 当我在声明 ExecuterService 实例后忘记执行 shutdown() 命令时,我的程序从未关闭。 我猜 ExecuterService 可能有一个内部命令关闭它的线程,因为它实现了 Executor 接口,但没有明确的 shutdown() 命令。 我想知道 ExecutorService class 和相关线程内部会发生什么,例如线程什么时候会死,以及忘记 shutdown() 命令会发生什么。 谢谢。

Executors.newFixedThreadPool 使用给定数量的 "core" 线程创建一个线程池,在线程池上调用 shutdown() 方法之前,这些线程永远不会关闭。

看看finalize method of ThreadPoolExecutor (the concrete class returned by a call to Executors.newFixedThreadPool):

protected void finalize() {
  shutdown();
}

因此,如果 ExecutorService 实例符合垃圾回收条件,它将在调用 finalize() 时关闭。

但是,对于与 finalize() 方法相关的所有事情,您不应依赖于在任何特定时间(如果有的话)调用它。

newFixedThreadPool
池中的线程将一直存在,直到它被显式关闭。
因此,除非您显式调用 shutdown () ,否则执行程序服务对象有资格进行垃圾收集的可能性很小,线程可能仍然具有执行程序的引用。
JVM 默认关闭属于主线程的所有线程只有游泳池。