Параллельные коллекции по умолчанию поддерживаются ForkJoinTasks.defaultForkJoinPool
, что является lazy val
, поэтому оно создается при первом использовании.
Как и любой ForkJoinPool, он работает до тех пор, пока явно не выключится. У пула нет возможности узнать, будет ли он получать какие-либо новые задачи, а создание потоков относительно дорого, поэтому было бы бесполезно закрывать пул, когда он был пуст, только для запуска снова, как только будут добавлены новые задачи , Таким образом, его потоки зависают до тех пор, пока пул не будет явно закрыт.
В качестве конструктивного решения JVM не убивает другие потоки только потому, что основной поток завершается; в некоторых стилях программирования основной поток заканчивается относительно рано (например, подумайте о веб-серверах, где основной поток устанавливает все, запускает пул диспетчерских потоков, а затем выходит, но веб-сервер продолжает работать бесконечно).
Вы можете позвонить ForkJoinTasks.defaultForkJoinPool.shutdown()
, как только вы узнаете, что больше не будете выполнять параллельные операции, или вы можете создавать параллельные коллекции, используя настраиваемый пул, который явно контролируется вашим кодом.
AFAIK, JVM будет ждать завершения любого не-демона, даже если ваш основной метод завершен. Можете ли вы поделиться некоторым примером кода, чтобы воспроизвести описанное вами поведение? – tuxdna
Да, я знаю, вопрос в том, почему любые нитки выходят из моего основного метода, в общем. Я попытаюсь извлечь общий пример кода действительно ... до этого просто задавался вопросом, что может быть общим объяснением – matanster