Как эффективно обработать несколько результатов службы исполнителя

StackOverflow https://stackoverflow.com/questions/7336879

Вопрос

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

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

И я прав, предполагая, что get () возвращает результат метода Callable реализации () Call ()? Я использую класс 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) ); 
Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top