ExecutorService java可能存在线程泄漏

ExecutorService java可能存在线程泄漏,java,multithreading,executorservice,Java,Multithreading,Executorservice,我正在尝试运行这个简单的类,对于每个循环,我都在计算java进程线程的数量 ps-huH-p-pid | wc-l 我在centOS 6.5上测试oracle java 1.8.0\u 20版 对于每个cicle,线程数增加了可用处理器()的数 当ExecutorService在另一个线程中运行时,garbace收集器似乎不会释放僵尸线程 如果我创建一个静态ExecutorService,它不会发生 private static final ExecutorService executor=Ex

我正在尝试运行这个简单的类,对于每个循环,我都在计算java进程线程的数量

ps-huH-p-pid | wc-l

我在centOS 6.5上测试oracle java 1.8.0\u 20版

对于每个cicle,线程数增加了可用处理器()的

当ExecutorService在另一个线程中运行时,garbace收集器似乎不会释放僵尸线程

如果我创建一个静态ExecutorService,它不会发生

private static final ExecutorService executor=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());)

import java.util.ArrayList;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
导入java.util.concurrent.TimeUnit;
公共类ExecutorTest实现Runnable{
私有ExecutorService executor=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
私有静态最终整数=100;
专用静态最终整数等待时间=20秒;
@凌驾
公开募捐{
试一试{
ArrayList responses=新的ArrayList();

对于(int i=0;i在run()方法中添加一个try/finally块,并在finally块中的
executor
上调用
shutdownow()

如果正确地遍历了代码,则获得多个池对象的原因是因为该语句

new Thread(new ExecutorTest()).start();
for循环中的每次执行都将创建 ExecutorService,因为它是类ExecutorTest的成员变量。 即使没有关机,您的程序也会继续运行 线程将不会被GCed,因为它们在 池已关闭

如果将其设置为静态变量,则只有一个ExecutorService 类级别内的对象,这就是为什么不获取多个 创建了池对象,因此最好不要关闭池
您将得到一个异常。

谢谢!这解决了问题,但从理论上讲,这将由垃圾收集器运行?不是吗?@user1535271不,GC不会收集活动线程。如果您不关闭ExecutorService,线程将不会被破坏,线程将保持活动状态。如果线程是
守护进程,则不是这样
在某些方面。默认情况下,ES线程是非守护进程。线程实际上是java中定义活动对象的对象,因此,根据定义,GC无法收集线程…@JohnVint-使线程守护进程无法解决线程永远存在的问题,它只会导致它们不阻止关闭。我像一个链一样思考:
new Thread(new ExecutorTest()).start();