Когда стоит указывать отдельное ядро ​​и максимальный размер пула в ThreadPoolExecutor? - PullRequest
5 голосов
/ 21 сентября 2011

Я пытаюсь понять смысл в определении отдельного ядра и максимальных размеров пула для ThreadPoolExecutor в Java 5. Насколько я понимаю, количество потоков увеличивается только после заполнения очереди, что кажется немного запоздалым (по крайней мере, с большими очередями).

Не правда ли, что я либо рад выделить большее количество потоков для задач, и в этом случае я мог бы просто увеличить размер основного пула; или я на самом деле не желаю этого делать, и в этом случае мне лучше иметь большую очередь? В каком сценарии полезны отдельный размер ядра и максимальный размер пула?

Ответы [ 2 ]

4 голосов
/ 21 сентября 2011

Здесь обсуждается здесь .

Пул предназначен для работы при нормальной нагрузке в corePoolSize (до которого он наращивается, если не используется предварительный запуск),Когда возникает условие перегрузки (определяемое тем, что задач в процессе или в процессе больше, чем рабочих), мы используем очередь в качестве буфера - в ожидании, что нормальная рабочая нагрузка будет восстановлена ​​в ближайшем будущем.Если нас беспокоит чрезмерная перегрузка, мы можем использовать ограниченную очередь, и это говорит: «если очередь заполнится, добавьте больше рабочих до maxPoolSize».Если мы используем неограниченную очередь, мы говорим, что не ожидаем (или не заботимся) чрезмерной перегрузки.

Цель состоит в том, чтобы сбалансировать способность обрабатывать ожидаемую рабочую нагрузку, даже при кратковременных перегрузках, без чрезмерного создания потока и без слишком большого оттока потока (т. Е. Create-work-die-create).

2 голосов
/ 21 сентября 2011

Разница в том, что если вы меньше размера основного пула, каждая новая задача создает новый поток независимо от незанятых потоков в пуле. Количество потоков увеличивается только после заполнения очереди, если вы уже достигли размера основного пула, но все еще не достигли максимального значения.

Прекрасный пример этого - когда у вас есть система, в которой вы точно не знаете, сколько одновременной нагрузки она будет иметь (например, веб-сервер). Эта функция позволяет вам указывать базовый набор потоков, возможно, исходя из количества ядер, которые есть на вашей машине, но допускает большую нагрузку, чем вы ожидали.

Это особенно полезно, если у вас больше нагрузки ввода / вывода, чем вы ожидали, и потоки в вашем пуле проводят много времени, блокируя. Ваша очередь может легко заполниться без большой параллельной загрузки в этом сценарии, и это легко исправить, добавив пару новых потоков для обслуживания нескольких параллельных запросов.

...