考虑以下Java代码
void doSomething(Runnable r1, Runnable r2){
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(r1);
executor.execute(r2);
}
当我调用doSomething方法时,创建执行程序并依次执行任务r1和r2。
我的问题是:一旦两个任务r1和r2终止会发生什么?
我认为执行器对象将被垃圾收集,但我不知道它是否也会被关闭。如果执行程序为其执行创建了一个新线程,该线程是否会导致资源泄漏?
答案 0 :(得分:6)
我认为执行者对象将被垃圾收集,但我不这样做 知道是否会关机。
实际上,Executors.newSingleThreadExecutor()
下的FinalizableDelegatedExecutorService
个实例会在shutdown
上调用finalize
,表示在收集垃圾时它会自动关闭。
但是,我不认为过分依赖它是一个好主意,因为它更像是一个可能从一个版本更改为另一个版本的实现细节,您应该明确地将其关闭,而不是防止任何意外错误。
答案 1 :(得分:3)
从ExecutorService的文档中我们可以阅读
"应关闭未使用的ExecutorService以允许回收 它的资源。"
基本上,您必须手动终止执行程序服务。虽然执行器对象本身将被垃圾收集,但它的内部线程不会。
答案 2 :(得分:0)
如果GC根目录未引用该对象,则对象只能是GC。什么是GC根?最常见的是System类和正在运行的线程。 ExecutorService将创建并维护正在运行的线程,因此即使ES是在方法中创建的,ES仍然可以访问,而不是GC。
正如其他人所说,你需要关闭ES才能成为GC' d。