POC (доказательство концепции) пулов потоков с исполнителями

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

Теоретически я знаю об использовании пулов потоков с Исполнителями.

Я прошел через множество руководств, но не получил практических примеров того, почему мы должны использовать пулы потоков, это может быть newFixedThreadPool или newCachedThreadPool или newSingleThreadExecutor

с точки зрения масштабируемости и производительности.

Если кто-нибудь объяснит мне, что касается производительности и масштабируемости, с примерами об этом?


person Java    schedule 15.03.2012    source источник


Ответы (4)


Прежде всего, проверьте это описание пулов потоков, которое я написал вчера: Пул потоков Android для управления несколькими потоками обработки Bluetooth? (хорошо, речь шла об Android, но то же самое и с классической Java).

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

  • производитель: поток, который продолжает публиковать вакансии
  • очередь, в которой размещаются вакансии
  • потребители: рабочие потоки, которые берут задания из очереди и выполняют их

Вдобавок к этому, чтобы все это работало правильно, необходимо использовать синхронизацию, поскольку чтение и запись в очередь без синхронизации могут привести к повреждению и несогласованности данных. Кроме того, нам нужно сделать систему эффективной, поскольку потребители не должны тратить такты процессора, когда им нечего делать.

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

Решением является пул потоков. Он очень удобно управляет очередью работ, потребительскими потоками и всей необходимой синхронизацией. Все, что вам нужно сделать, это сыграть роль продюсера и наполнить пул заданиями!

person Tudor    schedule 15.03.2012

Я бы начал с проблемы и только потом пытался найти для нее решение.

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

Если вы не можете придумать, как использовать пулы потоков, не используйте их. ;)

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

Хорошей причиной для использования пулов потоков является повышение производительности процессов, связанных с ЦП, и простота процессов, связанных с вводом-выводом (вместо использования неблокирующего ввода-вывода с одним потоком).

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

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

Примечание 2. Распространенной ошибкой является предположение, что задачи, привязанные к ЦП, будут лучше всего выполняться на сотнях или тысячах потоков. Оптимальное количество потоков может быть количеством ядер или процессоров, которые у вас есть. Как только все они будут заняты, вы можете обнаружить, что дополнительные потоки просто добавляют накладные расходы.

person Peter Lawrey    schedule 15.03.2012

Инициализация нового потока (и его собственного стека) — дорогостоящая операция.

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

Также обратите внимание, что созданные потоки, возможно, потребуется «удалить» после того, как они были использованы, что увеличивает стоимость сборки мусора и частоту ее выполнения (поскольку память заполняется быстрее).

Этот анализ только с точки зрения производительности. На данный момент я не могу придумать преимущества использования пулов потоков с точки зрения масштабируемости.

person lucian.pantelimon    schedule 15.03.2012

Я погуглил «зачем использовать пулы потоков Java» и нашел:

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

http://www.ibm.com/developerworks/library/j-jtp0730/index.html

а также

Метод newCachedThreadPool создает исполнитель с расширяемым пулом потоков. Этот исполнитель подходит для приложений, которые запускают множество краткосрочных задач. Метод newSingleThreadExecutor создает исполнитель, который одновременно выполняет одну задачу.

http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

person Allan    schedule 15.03.2012