ожидание любого готового вызываемого возвращаемого значения, как только оно завершится в списке вызываемых объектов

#java #multithreading #future #executorservice

#java #многопоточность #будущее #executorservice

Вопрос:

TL; DR: я хочу иметь возможность ждать всех фьючерсов, но получать возвращаемое значение каждого вызываемого объекта, как только оно завершится.

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

Комментарии:

1. Что вы делаете с теми, которые завершаются до последнего, пока вы все еще ждете? Не могли бы вы добавить пример?

2. @ernest_k Я просто пересылаю результат в следующий поток обработки.

3. оберните вызываемый объект методом, который принимает результат и помещает в очередь блокировки. Пусть основной поток прочитает очередь.

Ответ №1:

Это то ExecutorCompletionService , для чего нужно.

 Executor executor = ...;
List<Callable<T>> tasks = List.of(...);
CompletionService<T> completionService = new ExecutorCompletionService<>(executor);
tasks.forEach(completionService::submit);
for (int i = 0; i < tasks.size(); i  ) {
    T result = completionService.take().get();
    // A task has completed. Use its result.
}