java中Executor服务的范围?

时间:2015-06-01 20:04:44

标签: java multithreading threadpoolexecutor

最近我一直在使用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个线程池会发生什么。它是否总是在我的记忆中等待线程,或者一旦完成所有线程就会被摧毁?

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

ExecutorService将被垃圾收集,但在所有任务完成之前,基础ThreadPoolExecutor将不会被垃圾收集。如果您将查看java.util.concurrent.ThreadPoolExecutor的代码,您将看到它将任务包装在嵌套的Worker类的实例中,该类与任何嵌套的类实例一样,具有对{的隐式引用。 {1}}创建它的对象。此ThreadPoolExecutor类将提交给Worker对象进行运行,因此在Thread处于活动状态之前,它会保留对Thread的传递引用,并使其不会被垃圾回收。