java 中的执行者服务范围?

Scope of Executor Service in java?

最近我一直在使用VM模板将一些内容写入.vm文件,然后将vm文件的内容作为.txt文件存储在我的电脑中。起初,我一直在为每个文件创建过程创建单独的线程,这并不好,因为在短时间内没有大量线程创建。所以我想用线程池

考虑以下方法

public void runHugeNoOfShortTimeTasks() {
    ExecutorService service = Executors.newFixedThreadPool(100);
    for(int i=0;i<10000;i++){
        service.submit(runnableWriteToVMAndConvertToTXTFile());   // Each process would take around 1-3 seconds
    }
}

现在考虑完成 for 循环需要 0.5 秒。如果循环结束,进程将退出 runHugeNoOfShortTimeTasks() 方法。但是 ExecutorService 的范围是在那个方法内,那么队列中的线程和正在处理的线程会发生什么?一旦进程退出 runHugeNoOfShortTimeTasks() 方法,Executor 服务是否会被垃圾回收?

另一件事是,一旦队列中的所有线程都完成(如果它不会被垃圾收集),固定线程池 100 会发生什么。它会一直留在我的内存中等待线程,还是会在所有线程完成后被销毁?

也许我的理解方式完全错误,如果我错了请澄清我..

不,一旦 thread 退出 runHugeNoOfShortTimeTasks(),ExecutorService 将不会被垃圾回收。这是因为 ExecutorService 用于 运行 任务的线程仍然可以 "reach" 对象。一旦所有任务完成,线程将退出并死亡,此时 ExecutorService 将有资格进行垃圾收集

ExecutorService 将被垃圾回收,但底层 ThreadPoolExecutor 在所有任务完成之前不会被垃圾回收。如果您查看 java.util.concurrent.ThreadPoolExecutor 的代码,您会发现它将任务包装在嵌套 Worker class 的实例中,与任何嵌套 class 实例一样, 具有对创建它的 ThreadPoolExecutor 对象的隐式引用。此 Worker class 被提交给 Thread 对象用于 运行,因此在 Thread 存在之前它持有对 ThreadPoolExecutor 的传递引用并且使其免于垃圾回收。