ExecutorService, который динамически масштабирует количество потоков.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ExecutorService, который динамически масштабирует количество потоков.

Сообщение Anonymous »

У меня есть список рабочих подразделений, и я хочу обрабатывать их параллельно. Работа блока составляет 8-15 секунд каждый, полностью расчетное время, без блокировки ввода-вывода. Чего я хочу добиться, так это иметь ExecutorService, который:
  • не создает ни одного потока, когда нет работы
  • при необходимости можно динамически масштабировать до 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»