GrabDuck

Пулы потоков (Учебные руководства Java™> Существенные Классы> Параллелизм)

:

Большинство реализаций исполнителя в java.util.concurrent используйте пулы потоков, которые состоят из рабочих потоков. Этот вид потока существует отдельно от Runnable и Callable задачи это выполняется и часто используется, чтобы выполнить многократные задачи.

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

Один общий тип пула потоков является фиксированным пулом потоков. У этого типа пула всегда есть конкретное количество выполнения потоков; если поток так или иначе завершается, в то время как это находится все еще в использовании, это автоматически заменяется новым потоком. Задачи представляются пулу через внутреннюю очередь, которая содержит дополнительные задачи всякий раз, когда есть более активные задачи чем потоки.

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

Простой способ создать исполнителя, который использует фиксированный пул потоков, состоит в том, чтобы вызвать newFixedThreadPool метод фабрики в java.util.concurrent.Executors Этот class также обеспечивает следующие методы фабрики:

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

Если ни один из исполнителей, предоставленных вышеупомянутыми методами фабрики, не удовлетворяет Ваши потребности, создавая экземпляры java.util.concurrent.ThreadPoolExecutor или java.util.concurrent.ScheduledThreadPoolExecutor даст Вам дополнительные опции.