Разница в Java между фиксированным пулом потоков и запланированным пулом потоков - PullRequest
5 голосов
/ 18 мая 2011

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

Чтение документации мне не очень помогло.

newFixedThreadPool

public static ExecutorService newFixedThreadPool (int nThreads)

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

Параметры: nThreads - количество потоков в пуле. Возвращает: вновь созданныйпул потоков

newScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool (int corePoolSize)

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

Параметры: corePoolSize - количество потоков, которые должны храниться в пуле, даже если они простаивают.Возвращает: вновь созданный запланированный пул потоков

Что я не понимаю, так это corePoolSize и nThreads - это одно и то же?Является ли запланированный пул потоков действительно подмножеством фиксированного пула потоков, что означает, что я могу использовать запланированный пул потоков в качестве фиксированного пула потоков, который может ставить в очередь отложенные задачи?

Ответы [ 4 ]

4 голосов
/ 18 мая 2011

Да, это в основном одно и то же, только с добавленной функциональностью планирования. ScheduledThreadPoolExecutor даже расширяет стандартную реализацию ExecutorService (ThreadPoolExecutor).

nThreads и corePoolSize - количество потоков, которые будут порождены. Для фиксированного исполнителя это всегда одинаково. С другой реализацией она варьируется между min (corePoolSize) и max (maxPoolSize).

1 голос
/ 18 мая 2011

Да, это работает в JDK5-6. Хотя в принципе интерфейс ScheduledExecutorService не отвечает на вопрос о размере пула, фактическая реализация, используемая в JDK, использует фиксированный пул:

Класс ScheduledThreadPoolExecutor

Хотя этот класс наследует от ThreadPoolExecutor, некоторые из унаследованные методы настройки не полезно для этого. В частности, потому что он действует как пул фиксированного размера, используя corePoolSize и неограниченные потоки очередь, корректировки в MaximumPoolSize не имеет никакого полезного эффекта.

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

0 голосов
/ 23 июля 2017

Метод newScheduledThreadPool используется для создания пула потоков из ровно n потоков, независимо от того, являются ли они свободными или работающими. Аргумент int указывает количество потоков.

Метод newFixedThreadPool не используется для создания пула потоков из точно n потоков, независимо от того, являются ли они свободными или работающими. Размер фиксированного пула потоков зависит от количества активных задач.

0 голосов
/ 18 мая 2011

Да, они одинаковы в отношении размера пула потоков: они в конечном итоге оба вызывают один и тот же ThreadPoolExecutor конструктор .

...