- не создает ни одного потока, когда нет работы
- при необходимости можно динамически масштабировать до 20 потоков
- разрешить добавлять все рабочие единицы одновременно (без блокировки отправки)
Код: Выделить всё
Queue queue = new ConcurrentLinkedDeque();
ExecutorService service = ....
for(WorkUnit unit : list) {
service.submit(() -> {
.. do some work ..
queue.offer(result);
);
}
while(queue.peek() != null) {
... process results while they arrive ...
}
- Использование newCachedThreadPool() создает слишком много потоков
- Затем я использовал его внутренний вызов new ThreadPoolExecutor(0, 20, 60L, SECONDS, new SynchronousQueue()), но потом я заметил, что submit() блокируется из-за синхронной очереди
- Поэтому я использовал new LinkedBlockingQueue(), просто чтобы узнать, что ThreadPoolExecutor порождает только один поток
Может кто-нибудь посоветовать?
Подробнее здесь: https://stackoverflow.com/questions/653 ... of-threads