POC (Подтверждение концепции) ThreadPools с исполнителями - PullRequest
1 голос
/ 15 марта 2012

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

Я знаю об использовании потоков пула с Executors теоретически.

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

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

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

Ответы [ 4 ]

2 голосов
/ 15 марта 2012

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

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

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

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

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

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

1 голос
/ 15 марта 2012

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

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

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

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

1 голос
/ 15 марта 2012

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

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

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

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

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

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

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

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

0 голосов
/ 15 марта 2012

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

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

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

и

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

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

...