Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Полная статья

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

Возьмите этот пример. Начальный размер пула потоков равен 1, размер пула пулов - 5, максимальный размер пула - 10, а очередь - 100. По мере того, как запросы поступают в потоки, будут созданы до 5, тогда задачи будут добавляться в очередь до достижения 100. Когда очередь будет заполнена новыми потоками до maxPoolSize. После того, как все потоки будут использоваться и очередь будет заполнена, задачи будут отклонены. По мере уменьшения очереди количество активных потоков также уменьшается.