2013-07-15 2 views
13

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

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

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

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

+1

1. Как выполнить() знать, что ваши другие рабочие потоки простаивают? Вернули ли вы их обратно в бассейн, когда закончите с ними? –

+0

2. Похоже, что ThreadPoolExecutor пытается поддерживать пул используемых потоков больше, чем corePoolSize, но меньше, чем maximumPoolSize. –

+0

@RobertHarvey, пожалуйста, отправьте это как ответ. – zEro

ответ

8

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

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

5

Сердечник и максимальный размеры бассейна

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

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

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

+0

Пожалуйста, попробуйте отформатировать свой ответ, чтобы улучшить читаемость. – harpun

14

Вот правила Солнца для создания потока в простых терминах:

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

Full article

Смежные вопросы