Подтвердить что ты не робот

Пул потоков против возникновения нити

Может ли кто-нибудь перечислить некоторые точки сравнения между Thread Spawning vs Thread Pooling, какой из них лучше? Пожалуйста, рассмотрите платформу .NET как ссылочную реализацию, которая поддерживает оба.

4b9b3361

Ответ 1

Нитки пула потоков намного дешевле обычного потока, они объединяют системные ресурсы, необходимые для потоков. Но у них есть ряд ограничений, которые могут сделать их непригодными:

  • Вы не можете прервать поток threadpool
  • Нет простого способа обнаружить, что завершился threadpool, нет Thread.Join()
  • Не существует простого способа исключить исключения из потока threadpool
  • Вы не можете отображать какой-либо пользовательский интерфейс в потоке threadpool за пределами окна сообщения
  • Нить threadpool не должна работать дольше нескольких секунд.
  • Нить threadpool не должна блокироваться в течение длительного времени

Последние два ограничения являются побочным эффектом планировщика потока, он пытается ограничить количество активных потоков количеством ядер, доступных вашему процессору. Это может вызвать длительные задержки, если вы планируете много длинных потоков, которые часто блокируются.

Многие другие реализации threadpool имеют схожие ограничения, дают или принимают.

Ответ 2

"Пул" содержит список доступных "потоков", готовых к использованию, тогда как "нерестится" означает фактически создание нового потока.

Полезность "Объединения потоков" заключается в "более низком времени использования": издержки времени на создание исключаются.

В терминах "какой из них лучше": это зависит. Если проблема с созданием времени является проблемой, используйте объединение потоков. Это обычная проблема в средах, где необходимо выполнить множество "непродолжительных задач".


Как отмечают другие люди, для пула потоков есть "управленческие накладные расходы": это минимально, если они правильно реализованы. Например. ограничение количества потоков в пуле тривиально.

Ответ 3

Для некоторого определения "лучше" вы обычно хотите использовать пул потоков. Не зная, каков ваш вариант использования, учтите, что с пулом потоков у вас есть фиксированное количество потоков, которые могут быть созданы при запуске или могут быть созданы по требованию (но количество потоков не может превышать размер пула). Если задание отправлено и поток не доступен, он помещается в очередь до тех пор, пока поток не сможет обработать его.

Если вы создаете потоки в ответ на запросы или какой-либо другой триггер, вы рискуете исчерпать все свои ресурсы, так как нет ничего, чтобы ограничить количество созданных потоков.

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

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

Ответ 4

Все зависит от вашего сценария. Создание новых потоков является ресурсоемкой и дорогостоящей операцией. Наиболее короткие асинхронные операции (макс. Не более нескольких секунд) могут использовать пул потоков.

Для более длительных операций, которые вы хотите запустить в фоновом режиме, вы обычно создаете (создаете) свой собственный поток. (Ab) с использованием платформы/времени выполнения встроенного потока для длительных операций может привести к неприятным формам блокировок и т.д.

Ответ 5

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

Ответ 6

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

Обратите внимание, что даже ThreadPool должен "создавать" потоки... это обычно зависит от рабочей нагрузки - если предстоит много работы, хороший поток будет разворачивать новые потоки для обработки нагрузки на основе конфигурации и системные ресурсы.

Ответ 7

Это зависит от того, что вы хотите выполнить в другом потоке.

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

Ответ 8

Пул потоков обычно считается лучше, потому что потоки создаются спереди и используются по мере необходимости. Поэтому, если вы используете много потоков для относительно коротких задач, это может быть намного быстрее. Это происходит потому, что они сохраняются для будущего использования и не уничтожаются, а затем снова создаются.

Напротив, если вам нужны только 2-3 потока, и они будут созданы только один раз, тогда это будет лучше. Это связано с тем, что вы не получаете кеширования существующих потоков для будущего использования, и вы не создаете дополнительные потоки, которые не могут быть использованы.

Ответ 9

Для создания/нереста потока существует немного дополнительного времени, когда в опросе потоков уже содержатся созданные потоки, которые готовы к использованию.

Ответ 11

Для многопоточного исполнения в сочетании с получением возвращаемых значений из выполнения или простым способом обнаружения того, что пул потоков завершен, можно использовать java Callables.

Подробнее см. https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6.