2016-02-22 3 views
0

Мы ThreadPoolExecutor и его инициализация выглядит следующим образом:Может ли размер workQueue быть больше, чем maximumPoolSize?

LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(); 
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(maxThreads, maxThreads, 50000L, TimeUnit.MILLISECONDS, queue); 

И значение maxThreads 200, но приходит время, когда queue.size()> 200. Почему это может быть?

ответ

0

corePoolSize или maximumPoolSize определяет размер бассейна, это размер BlockingQueue, который имеет значение.

Вы используете LinkedBlockingQueue, это основано на связанной структуре и имеет максимальный размер по умолчанию Integer.MAX_VALUE. Она также позволяет изменить его максимальный размер, используя конструктор, передавая требуемый размер, например:

LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(200); 

Передавая 200 в своем конструкторе, вам бассейн будет держать максимум 200 задач

+0

Итак, кто определяет реальный размер бассейна? Размер 'LinkedBlockingQueue'? – Ksenia

0

maxThreads представляет максимальное количество объединенных потоков. Ваш размер очереди представляет собой количество заданных в очереди задач, ожидающих выполнения.

+0

так Безразлично» t эти запущенные задачи, ожидающие выполнения, хранятся в пуле? – Ksenia

+0

Нет, вы что-то путаете. У вас есть пул потоков, которые будут выполнять любую задачу «Runnable», которую они находят в «BlockingQueue». Ваша задача находится в рабочей очереди, когда поток пула становится доступным, он будет опросить ожидающую задачу и выполнить ее. – delephin

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