Как эффективно обрабатывать несколько результатов из службы Executor - PullRequest
1 голос
/ 07 сентября 2011

Я новичок в ExecutorService, но не уверен в своем подходе к этому. Я мог иметь дело до 100 потоков для известной задачи. Я использую общий формат ниже, где я создаю Список FutureTasks, а затем отправляю их в ExecutorService. ExecutorService возвращает и добавляет эти ожидающие результаты в другой список. Затем я перебираю этот список, вызывая get () для каждого ожидающего результата.

Мой запрос таков: не будет ли этот блок в каждом get () по очереди, пока не завершатся все 100 потоков? Есть лучший способ сделать это ?

И прав ли я, предполагая, что get () возвращает результат метода call () реализации Callable? Я использую класс FutureTask по умолчанию и не разделил его на подклассы.

ExecutorService exec = Executors.newFixedThreadPool( NUM_THREADS );

List<JobClass> originalList = new ArrayList<JobClass>();

List<SomeOtherClass> pendingResult = new ArrayList<SomeOtherClass>();

List<Future<SomeOtherClass>> resultList = new ArrayList<Future<SomeOtherClass>>();

for( JobClass sc : originalList )
    pendingResult.add( submit( sc );

for( Future<SomeOtherClass> future : futures )
    resultList.add( future.get(5, TimeUnit.SECONDS) ); 

Ответы [ 2 ]

5 голосов
/ 07 сентября 2011

Хороший вопрос, если я вас правильно понимаю, вас беспокоит потребление результата выполненных заданий. Да нить заблокирует. Java ответит на это с помощью CompletionService .

Как упомянуто на странице документации "Служба, которая отделяет производство новых асинхронных задач от потребления результатов выполненных задач".

2 голосов
/ 07 сентября 2011

Если вы продолжите, только если все задачи выполнены, вы можете делать то, что предлагали.Не имеет значения, в каком порядке задачи завершены.Однако, если вам нужно как можно скорее передать результаты задачи другому процессору или сделать что-то еще во время выполнения задач, вы можете сначала проверить, завершена ли задача, например, с использованием метода isDone, и вызвать get(), еслиэто завершено.

...