java 等待所有 listfuture 完成
在Java中,可以使用ExecutorService和CompletionService来等待所有List
首先,需要创建一个ExecutorService来执行任务,并创建一个CompletionService来获取已完成的任务结果。然后,使用ExecutorService的submit方法提交所有任务,并将返回的Future对象存储到List中。
接下来,使用一个循环来从CompletionService中获取已完成的任务结果,直到所有任务都完成。可以使用List的size方法来判断任务是否全部完成。
以下是一个示例代码:
ExecutorService executorService = Executors.newFixedThreadPool(10);
CompletionService<Integer> completionService = new ExecutorCompletionService<>(executorService);
List<Callable<Integer>> tasks = new ArrayList<>();
// 添加任务到tasks列表
// 提交所有任务,并将返回的Future对象存储到List中
List<Future<Integer>> futures = new ArrayList<>();
for (Callable<Integer> task : tasks) {
futures.add(completionService.submit(task));
}
// 等待所有任务完成
int completedTasks = 0;
while (completedTasks < futures.size()) {
try {
Future<Integer> completedFuture = completionService.take();
completedTasks++;
// 处理已完成的任务结果
Integer result = completedFuture.get();
// 处理result
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
// 关闭ExecutorService
executorService.shutdown();
在示例代码中,通过调用completionService.take()方法来获取已完成的任务结果,如果没有任务完成,则该方法会阻塞等待。完成的任务结果存储在一个Future对象中,可以通过调用Future的get()方法来获取结果。在处理完任务结果后,递增completedTasks的计数器。
请注意,需要适当地处理InterruptedException和ExecutionException异常。此外,还需要在任务全部完成后关闭ExecutorService,以释放资源。
希望能帮到你
原文地址: https://www.cveoy.top/t/topic/ivHm 著作权归作者所有。请勿转载和采集!