Объем службы исполнителя в java?

Недавно я использовал шаблон виртуальной машины для записи некоторого содержимого в файл .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 после того, как все потоки в очереди будут завершены (если он не будет собирать мусор). Будет ли он всегда находиться в моей памяти в ожидании потоков или он будет уничтожен после завершения всех потоков?

Может быть, я совершенно ошибаюсь в своем понимании, объясните мне, если я ошибаюсь..


person The Coder    schedule 01.06.2015    source источник
comment
См. stackoverflow.com/questions/24953978/   -  person 6ton    schedule 01.06.2015
comment
Кстати, очень плохо писать, Executors.newFixedThreadPool(100);. Лучшим выбором будет Executors.newWorkStealingPool(), который создаст столько потоков, сколько компьютер может использовать одновременно.   -  person Max    schedule 01.02.2018


Ответы (2)


Нет, ExecutorService не будет собираться после того, как thread выйдет из runHugeNoOfShortTimeTasks(). Это связано с тем, что потоки, которые ExecutorService использует для запуска задач, все еще могут «достичь» объекта. Как только все задачи будут завершены, потоки завершатся и умрут, и в этот момент ExecutorService получит право на сборку мусора.

person ControlAltDel    schedule 01.06.2015
comment
Теперь меня смущают совершенно два разных ответа. - person The Coder; 01.06.2015
comment
@ user1354678 Бенджи Кесслер рассказывает о том, что происходит, когда заканчивается Process. Вы использовали слова «... процесс выхода ...» в своем первоначальном вопросе, так что это то, на что он отвечал. Процесс — это объект более высокого уровня, который может содержать множество потоков выполнения. Как только процесс завершится (например, когда вы закроете все окна браузера), все потоки в этих окнах будут закрыты, и вся память будет восстановлена. - person ControlAltDel; 01.06.2015
comment
Спасибо .. Я даже проверил это сейчас со своим кодом. Служба Executor все еще жива, и потоки все еще работают, даже если он выходит из этого метода runHugeNoOfTasksMethod(); - person The Coder; 01.06.2015
comment
Это неправильно. документация для исполнителей. newFixedThreadPool(int) говорит, что потоки в пуле будут существовать до тех пор, пока он не будет явно отключен. Таким образом, будет 100 активных потоков даже после завершения всех задач в пуле. - person Max; 01.02.2018

ExecutorService будет собираться мусор, но нижележащий ThreadPoolExecutor не будет собираться до тех пор, пока не будут завершены все задачи. Если вы посмотрите на код java.util.concurrent.ThreadPoolExecutor, вы увидите, что он заключает задачу в экземпляр вложенного класса Worker, который, как и любой экземпляр вложенного класса, имеет неявную ссылку на объект ThreadPoolExecutor, создавший его. Этот класс Worker передается объекту Thread для выполнения, поэтому до тех пор, пока Thread жив, он содержит транзитивную ссылку на ThreadPoolExecutor и удерживает его от сборки мусора.

person Sergei    schedule 01.06.2015