Получение первого завершенного Future
из списка фьючерсов напрямую невозможно, так как они обрабатываются параллельно, и вам придется заблокировать каждый раз, чтобы найти результат.
Однако вы можете контролировать задачузавершение с использованием ExecutorsCompletionService
для параллельной обработки. Этот класс имеет take
и poll
методы, которые возвращают Future
следующей завершенной задачи:
A CompletionService
, которая использует предоставленный Executor
для выполнения задач. Этот класс организует, чтобы отправленные задачи после завершения помещались в очередь, доступную с помощью take
. Класс является достаточно легким, чтобы его можно было использовать для временной обработки при обработке групп задач.
ExecutorService threadPool = Executors.newCachedThreadPool();
CompletionService<Integer> ecs = new ExecutorCompletionService<>(threadPool);
int tasks = 10;
IntStream.range(0, tasks)
.forEach(i -> ecs.submit(() -> i)); // submit tasks
for(int i = 0; i < tasks; i++) {
Future<Integer> take = ecs.take(); // this is blocking operation but futures are returned in completion order. Also you will have to handle InterruptedException
}
// remember to close the ExecutorService after you are done