2014-10-20 7 views
0

Я использую параллельные коллекции, и когда мое приложение завершается, SBT вопросы:Scala параллельные коллекции, нити терминации и SBT

Not interrupting system thread Thread[process reaper,10,system]

Он выдает соответствующее сообщение один раз для каждого ядра (минус один, чтобы быть точным).

Я видел в sbt-коде, что это по дизайну, но я не уверен, почему ничто не заканчивается вместе с моим приложением. Любое понимание будет оценено, если вам не повезло, чтобы натолкнуться на то же самое ...

+0

AFAIK, JVM будет ждать завершения любого не-демона, даже если ваш основной метод завершен. Можете ли вы поделиться некоторым примером кода, чтобы воспроизвести описанное вами поведение? – tuxdna

+0

Да, я знаю, вопрос в том, почему любые нитки выходят из моего основного метода, в общем. Я попытаюсь извлечь общий пример кода действительно ... до этого просто задавался вопросом, что может быть общим объяснением – matanster

ответ

1

Параллельные коллекции по умолчанию поддерживаются ForkJoinTasks.defaultForkJoinPool, что является lazy val, поэтому оно создается при первом использовании.

Как и любой ForkJoinPool, он работает до тех пор, пока явно не выключится. У пула нет возможности узнать, будет ли он получать какие-либо новые задачи, а создание потоков относительно дорого, поэтому было бы бесполезно закрывать пул, когда он был пуст, только для запуска снова, как только будут добавлены новые задачи , Таким образом, его потоки зависают до тех пор, пока пул не будет явно закрыт.

В качестве конструктивного решения JVM не убивает другие потоки только потому, что основной поток завершается; в некоторых стилях программирования основной поток заканчивается относительно рано (например, подумайте о веб-серверах, где основной поток устанавливает все, запускает пул диспетчерских потоков, а затем выходит, но веб-сервер продолжает работать бесконечно).

Вы можете позвонить ForkJoinTasks.defaultForkJoinPool.shutdown(), как только вы узнаете, что больше не будете выполнять параллельные операции, или вы можете создавать параллельные коллекции, используя настраиваемый пул, который явно контролируется вашим кодом.

+0

Спасибо! отличный информативный ответ – matanster

+0

Кажется, что sbt просто вежливо уведомляет, что он поддерживает эти потоки – matanster

Смежные вопросы