#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.
}