Недавно я использовал шаблон виртуальной машины для записи некоторого содержимого в файл .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 находится внутри этого метода, так что же произойдет с потоками в очереди и теми, которые обрабатываются? Будет ли служба Executor собирать мусор после того, как процесс выйдет из метода runHugeNoOfShortTimeTasks()
?
Другое дело, что произойдет с этим фиксированным пулом потоков из 100 после того, как все потоки в очереди будут завершены (если он не будет собирать мусор). Будет ли он всегда находиться в моей памяти в ожидании потоков или он будет уничтожен после завершения всех потоков?
Может быть, я совершенно ошибаюсь в своем понимании, объясните мне, если я ошибаюсь..
Executors.newFixedThreadPool(100);
. Лучшим выбором будетExecutors.newWorkStealingPool()
, который создаст столько потоков, сколько компьютер может использовать одновременно. - person Max   schedule 01.02.2018