Java newSingleThreadExecutor 垃圾回收

Java newSingleThreadExecutor garbage collection

考虑以下 Java 代码

void doSomething(Runnable r1, Runnable r2){
  Executor executor = Executors.newSingleThreadExecutor();
  executor.execute(r1);
  executor.execute(r2);
}

当我调用 doSomething 方法时,执行器被创建并依次执行任务 r1 和 r2。

我的问题是:r1 和 r2 这两个任务终止后会发生什么?

我想执行器对象会被垃圾回收,但我不知道它是否也会被关闭。如果执行者创建一个新的线程来执行,这个线程会不会导致资源泄漏?

I suppose the executor object will be garbage collected, but I do not know whether it will be also shutdown.

实际上Executors.newSingleThreadExecutor() under the wood 创建了一个FinalizableDelegatedExecutorService 实例,它将在finalize 上调用shutdown 表明它会在被垃圾收集时自动关闭。

但是,我认为过度依赖它不是一个好主意,因为它更多的是一个可能从一个版本到另一个版本的实现细节,你应该明确地关闭它而不是防止任何意外的错误。

ExecutorService 的文档中我们可以读到

"An unused ExecutorService should be shut down to allow reclamation of its resources."

基本上,您必须手动终止执行程序服务。虽然 executor 对象本身会被垃圾回收,但它的内部线程不会。

只有当对象没有被 GC 根引用时,对象才能被 GC。什么是 GC 根?最常见的是系统 类 和 运行 线程。 ExecutorService 将创建和维护 运行 个线程,因此即使 ES 是在一个方法中创建的,ES 仍然可以访问并且不会被 GC。

正如其他人提到的,您需要关闭 ES 才能对其进行 GC。