Java newSingleThreadExecutor垃圾回收

时间:2016-09-29 14:36:01

标签: java multithreading executor

考虑以下Java代码

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

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

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

我认为执行器对象将被垃圾收集,但我不知道它是否也会被关闭。如果执行程序为其执行创建了一个新线程,该线程是否会导致资源泄漏?

3 个答案:

答案 0 :(得分:6)

  

我认为执行者对象将被垃圾收集,但我不这样做   知道是否会关机。

实际上,Executors.newSingleThreadExecutor()下的FinalizableDelegatedExecutorService个实例会在shutdown上调用finalize,表示在收集垃圾时它会自动关闭。

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

答案 1 :(得分:3)

ExecutorService的文档中我们可以阅读

  

"应关闭未使用的ExecutorService以允许回收   它的资源。"

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

答案 2 :(得分:0)

如果GC根目录未引用该对象,则对象只能是GC。什么是GC根?最常见的是System类和正在运行的线程。 ExecutorService将创建并维护正在运行的线程,因此即使ES是在方法中创建的,ES仍然可以访问,而不是GC。

正如其他人所说,你需要关闭ES才能成为GC' d。