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

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

Кто-нибудь может это объяснить?

Спасибо


person One Two Three    schedule 08.04.2013    source источник
comment
Для справки: документы. oracle.com/javase/7/docs/api/java/util/concurrent/   -  person Sotirios Delimanolis    schedule 09.04.2013


Ответы (2)


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

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

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

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

person Antoniossss    schedule 19.08.2016

По сути, corePoolSize — это количество потоков, которые необходимо поддерживать в пуле.

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

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

Размер ядра и максимальный размер пула

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

person drunkenRabbit    schedule 08.04.2013
comment
К сожалению, ScheduledThreadPoolExecutor не обрабатывает эти параметры так же, как ThreadPoolExecutor. STPE действует как фиксированный пул потоков размером corePoolSize и не создает никаких дополнительных потоков. maxPoolSize ничего не делает. - person Mike Q; 01.08.2014
comment
Повторяя заявление Майка Кью по этому поводу. Похоже, что реализация ScheduledThreadPoolExecutor в Java в этом отношении содержит ошибки. Передача только количества ядер не установит максимальное количество в API getMaximumPoolSize и вернет Integer.MAX_VALUE, что выглядит как неработающий API, если ядро ​​и максимальное значение всегда должны быть одинаковыми. Зачем им вообще реализовывать интерфейс ThreadPoolExecutor, если он не предназначен для использования? - person Hazok; 23.02.2016
comment
@Hazok, действительно maxPoolSize не изменяется, но его значение не учитывается реализацией, и фактическое corePoolSize будет использоваться как максимальное количество потоков. - person Antoniossss; 19.08.2016