从java中的未来列表中获得第一个完成未来的方法是什么?

use*_*010 4 java multithreading future

以下迭代未来列表的方式总是等待第一个工作完成:

for (Future<MyFutureResult> future : list) {
    List<MyFutureResult> result = future.get();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法先迭代所有完成工作?

mic*_*alk 6

Future无法直接从期货列表中获取第一个完成,因为它们是并行处理的,您必须阻止 anwyay 才能找到结果。

但是,您可以通过ExecutorsCompletionService用于并行处理来控制任务完成。这个类有takepoll方法,返回Future一个已完成的任务:

一个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
Run Code Online (Sandbox Code Playgroud)