2013-07-24 4 views
1

Я обсуждал, есть ли смысл использовать ExecutorService для простого, динамически растущего списка потоков одного и того же класса, все из которых всегда активны. Я понимаю, что Executors.newFixedThreadPool(int) предоставляет пул потоков, который может содержать любое количество потоков, но только номер, указанный в методе, активен в любой момент времени. У меня нет такого ограничения, IOW, если я добавлю 6 потоков, я хочу, чтобы все 6 выполнялись одновременно.Использование ExecutorService/ThreadPool для простого списка переменных всегда активных потоков

Должен ли я использовать фреймворк Executors, если есть какие-то преимущества для его использования, или просто поместить мои потоки в ArrayList?

+0

Весь смысл рамок Исполнители заключается в обеспечении лучшего контроля над управления threads.If вы думаете, есть что вы могли бы повторно использовать эти потоки в будущем контексте, тогда я бы рекомендовал использовать cachedThreadPool, иначе просто No – Phani

+0

они будут работать до тех пор, пока я не скажу им, чтобы все остановились, это не похоже на то, что кто-то перейдет в состояние ожидания или должен быть кэшированный для последующего использования. – amphibient

+0

Лучше работать с классами Core тогда. – Phani

ответ

2

Должен ли я использовать фреймворк Executors, если есть преимущества для его использования, или я должен просто поместить свои потоки в ArrayList?

Много людей развивают и управляют своими потоками. Тем не менее, основная причина, почему классы ExecutorService настолько сильно рекомендованы, так это то, что они заботятся об управлении потоками и связанными с ними задачах и уменьшают количество кода, который вы должны писать, отлаживать, поддерживать. Очевидно, они предоставляют множество других функций, таких как поддержка Callable, услуги по завершению и т. Д., Которые вы не можете использовать. Но оставить управление этими основными классами, даже для простого проекта, само по себе хорошо. Я использую их даже для однопоточных пулов, потому что я хочу, чтобы функции очереди задач Runnable пула потоков вместо того, чтобы писать собственный BlockingQueue или другой механизм.

если я добавляю 6 потоков, я хочу, чтобы все 6 работали одновременно.

Тогда вы должны использовать Executors.newCachedThreadPool(). Если вы отправите 6 заданий (экземпляр Runnable или Callable), то через него начнут обрабатываться 6 потоков. Если 3 задания заканчиваются и другие задания подаются, тогда 3 неактивных потока будут запускать другие задания.

ПРИМЕЧАНИЕ: если вы отправляете 1000 заданий, вы начнете 1000 потоков, которые, скорее всего, не, что вы хотите сделать.


Например, чтобы написать это самостоятельно будет принимать гораздо больше код:

// a pool of 10 threads 
ExecutorService threadPool = Executors.newFixedThreadPool(10); 
// submit a bunch of jobs to they 10 threads for processing 
for (MyJob job : jobsToDo) { 
    threadPool.submit(job); 
} 
// no more tasks are being submitted so shutdown the pool 
threadPool.shutdown(); 
// wait for the jobs to finish 
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 
+0

мой пул потоков не будет исправлен, то есть он может принимать любое количество рабочих – amphibient

+1

. Затем вы должны использовать 'newCachedThreadPool()' @amphibient. Я добавил подробности об этом в свой ответ. – Gray

+0

Вы все равно можете ограничить количество потоков, так как есть некоторые затраты, такие как размер стека или накладные расходы на планирование. –

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