use*_*010 4 java multithreading future
以下迭代未来列表的方式总是等待第一个工作完成:
for (Future<MyFutureResult> future : list) {
List<MyFutureResult> result = future.get();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法先迭代所有完成工作?
Future无法直接从期货列表中获取第一个完成,因为它们是并行处理的,您必须阻止 anwyay 才能找到结果。
但是,您可以通过ExecutorsCompletionService用于并行处理来控制任务完成。这个类有take和poll方法,返回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)