Значение "размер основного пула" в конструкторе 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).