Значение "размер основного пула" в конструкторе ScheduledThreadPoolExecutor

Я новичок в ScheduledThreadPoolExecutor (поскольку я обычно использую простой Timer, но люди его предупреждают), и я не совсем понимаю, что будет подходящим целым значением для перехода к ScheduledThreadPoolExecutor(int).

Может ли кто-нибудь объяснить это?

Спасибо

Ответ 1

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

Ответ DrunkenRabbit является просто ivalid, потому что ScheduledThreadPoolsExecutor docs явно говорит, что (не будет нищих нитей нити):

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

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

Ответ 2

По сути, corePoolSize - это количество потоков для поддержки в пуле.

например. если вы ожидаете 10 параллельных запросов на регулярной основе, но пики 20. CorePoolSize должен быть 10 и макс. 20. Таким образом, исполнитель создаст до 10 новых потоков, даже если для использования доступны незанятые потоки.

Как указано в JavaDocs

Основные и максимальные размеры пула

ThreadPoolExecutor автоматически настраивает размер пула (см. getPoolSize()) в соответствии с ограничениями, установленными corePoolSize (см. getCorePoolSize()) и maximumPoolSize (см. getMaximumPoolSize()). Когда новая задача отправляется при выполнении метода (java.lang.Runnable), и выполняется меньше потоков corePoolSize, для обработки запроса создается новый поток, даже если другие рабочие потоки простаивают. Если существует больше, чем corePoolSize, но меньше потоков MaximumPoolSize, новый поток будет создан только в том случае, если очередь заполнена. Установив corePoolSize и maximumPoolSize то же самое, вы создаете пул потоков фиксированного размера. Установив maximumPoolSize на существенно неограниченное значение, такое как Integer.MAX_VALUE, вы позволяете пулу вмещать произвольное количество одновременных задач. Как правило, размеры ядра и максимального пула устанавливаются только при построении, но их также можно динамически изменять с помощью setCorePoolSize (int) и setMaximumPoolSize (int).