2012-12-14 2 views
1

Я хотел бы выполнить следующее поведение, используя ExecutorService с Java. У меня есть большое количество задач, которые можно выполнить параллельно. Я хотел бы запланировать от моего основного потока только N задач в то время следующим образом:Java - ExecutorService для фиксированного количества заданий

  • если количество активных задач < N => планировать новое задание (исполнитель служба делает это уже)
  • else, блокируйте основной поток до тех пор, пока одна из задач не будет выполнена => в значительной степени такая же, как хранение N первых задач в очереди, а затем удаление первого и вызывающего get() на нем)

Есть ли способ настроить ExecutorService на выполнение, как указано выше?

+1

не является фиксированным исполнителем threadpool? – ElderMael

ответ

4

Использование ThreadPoolExecutor из N потоков, построенных с помощью SynchronousQueue. Каждый раз, когда вы отправляете задачу в пул потоков, основной поток будет блокироваться синхронной очередью, пока поток из пула не выведет задачу из очереди.

+0

Можете ли вы объяснить, как синхронная очередь блокирует основной поток? – Bober02

+0

Прочтите его javadoc. Там все объяснено. –

+1

Обратите внимание, что ваше объяснение того, почему вы хотите заблокировать основной поток, не имеет особого отношения. В конце концов, основной поток продолжит выполнение, но все еще будут файлы N, обрабатываемые пулом потоков. Почему бы вам не отправить все в фиксированный пул потоков и ждать возвращенных фьючерсов? –

0

Вы могли бы представить N задач на ExecutorCompletionService, а затем в цикле:

Future<?> f = executor.take(); //blocks until one task completes 
executor.submit(nextTask()); 

Делая это, вы убедитесь, что не более, что N задачи ставятся в очередь в исполнителю одновременно.

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