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

Когда новая задача отправляется в методе execute(java.lang.Runnable) и выполняется менее corePoolSize потоков, создается новый поток для обработки запроса, даже если другие рабочие потоки простаивают.

1) Почему необходимо создать новый поток для обработки запроса, если есть незанятые потоки?

Если запущено больше corePoolSize, но меньше maximumPoolSize потоков, новый поток будет создан только в том случае, если очередь заполнена.

2) Я не понимаю здесь разницы между corePoolSize и maximumPoolSize. Во-вторых, как может быть заполнена очередь, если количество потоков меньше maximumPoolSize? Очередь может быть заполнена только в том случае, если количество потоков равно или больше maximumPoolSize. Не так ли?


person user2568266    schedule 15.07.2013    source источник
comment
1. Как execute () узнает, что другие ваши рабочие потоки простаивают? Вы вернули их обратно в бассейн, когда закончили с ними?   -  person Robert Harvey    schedule 15.07.2013
comment
2. Похоже, ThreadPoolExecutor пытается поддерживать пул используемых потоков больше, чем corePoolSize, но меньше, чем maximumPoolSize.   -  person Robert Harvey    schedule 15.07.2013
comment
@RobertHarvey, опубликуйте это как ответ.   -  person zEro    schedule 15.07.2013
comment
@zEro: Я не эксперт по Java.   -  person Robert Harvey    schedule 15.07.2013


Ответы (3)


Вот простые правила Sun для создания потоков:

  1. Если количество потоков меньше, чем corePoolSize, создайте новый поток для запуска новой задачи.
  2. Если количество потоков равно (или больше) corePoolSize, поместите задачу в очередь.
  3. Если очередь заполнена, а количество потоков меньше maxPoolSize, создайте новый поток для выполнения задач.
  4. Если очередь заполнена, а количество потоков больше или равно maxPoolSize, отклоните задачу.

Полная статья < / а>

person taynguyen    schedule 27.01.2016
comment
Это, безусловно, наиболее четкое и краткое описание того, что делается. Большое спасибо за это ясное объяснение. - person Jack; 08.05.2019

Вы можете найти определение терминов corepoolsize и maxpoolsize в javadoc. http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

По ссылке выше есть ответ на ваш вопрос. Однако просто чтобы было понятно. Приложение будет создавать потоки, пока не достигнет corePoolSize. Это означает, что этого количества потоков должно хватить для обработки потока задач. После этого задачи будут поставлены в очередь. Как только очередь заполнится, исполнитель начнет создавать новые потоки. Это своего рода балансировка. По сути, это означает, что поток задач превышает возможности обработки. Итак, Executor снова начнет создавать новые потоки, пока не достигнет максимального количества потоков. Опять же, новые потоки будут созданы тогда и только тогда, когда очередь заполнена.

person Braj Kishore    schedule 02.09.2013

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

ThreadPoolExecutor автоматически регулирует размер пула в соответствии с границами, установленными corePoolSize и maximumPoolSize.

Когда новая задача отправляется в методе execute(java.lang.Runnable) и выполняется меньше потоков corePoolSize, создается новый поток для обработки запроса, даже если другие рабочие потоки простаивают. Если количество запущенных потоков больше corePoolSize, но меньше maximumPoolSize, новый поток будет создан только в том случае, если очередь заполнена. Устанавливая одинаковые значения corePoolSize и maximumPoolSize, вы создаете пул потоков фиксированного размера.

Установив для параметра maximumPoolSize практически неограниченное значение, такое как Integer.MAX_VALUE, вы разрешаете пулу размещать произвольное количество одновременных задач. Чаще всего размеры ядра и максимального пула устанавливаются только при создании, но они также могут быть изменены динамически с помощью setCorePoolSize(int) и setMaximumPoolSize(int). ссылка

person Adelin    schedule 29.01.2014
comment
Пожалуйста, попробуйте отформатировать свой ответ, чтобы его было удобнее читать. - person harpun; 30.01.2014