最近我一直在使用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个线程池会发生什么。它是否总是在我的记忆中等待线程,或者一旦完成所有线程就会被摧毁?
也许我的理解方式完全错了,如果我错了,请澄清我。
答案 0 :(得分:2)
不,一旦thread
退出runHugeNoOfShortTimeTasks()
,就不会对ExecutorService进行垃圾回收。这是因为ExecutorService用于运行任务的线程仍然可以“到达”Object。完成所有任务后,线程将退出并死亡,此时ExecutorService将有资格进行垃圾回收
答案 1 :(得分:2)
ExecutorService
将被垃圾收集,但在所有任务完成之前,基础ThreadPoolExecutor
将不会被垃圾收集。如果您将查看java.util.concurrent.ThreadPoolExecutor
的代码,您将看到它将任务包装在嵌套的Worker
类的实例中,该类与任何嵌套的类实例一样,具有对{的隐式引用。 {1}}创建它的对象。此ThreadPoolExecutor
类将提交给Worker
对象进行运行,因此在Thread
处于活动状态之前,它会保留对Thread
的传递引用,并使其不会被垃圾回收。