Как можно получить первое финишное будущее из списка будущего в Java? - PullRequest
1 голос
/ 22 октября 2019

Следующий способ итерации списка будущего всегда ждет, когда будет выполнено первое задание

for (Future<MyFutureResult> future : list) {
    List<MyFutureResult> result = future.get();
}

Есть ли способ выполнить итерацию всего завершающего задания первым?

1 Ответ

3 голосов
/ 22 октября 2019

Получение первого завершенного 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
...