循环提交Future任务,如何获取结果
时间: 2024-04-16 10:27:11 浏览: 84
Java利用future及时获取多线程运行结果
如果你需要循环提交多个Future任务,并在所有任务完成获取结果,你可以使用Java中的CompletionService来实现。
CompletionService是一个Executor和BlockingQueue的组合,它将已完成的任务包装成Future对象并放入队列中。你可以通过轮询队列或使用take()方法来获取已完成的任务结果。
以下是一个示例代码,演示如何循环提交Future任务并获取结果:
```java
ExecutorService executor = Executors.newFixedThreadPool(5);
CompletionService<Integer> completionService = new ExecutorCompletionService<>(executor);
// 提交多个任务
for (int i = 0; i < 10; i++) {
final int taskId = i;
completionService.submit(() -> {
// 执行任务,返回结果
return taskId * 2;
});
}
// 获取已完成的任务结果
for (int i = 0; i < 10; i++) {
try {
Future<Integer> future = completionService.take(); // 阻塞直到有任务完成
Integer result = future.get(); // 获取任务结果
// 使用任务结果
System.out.println("Result: " + result);
} catch (InterruptedException e) {
// 处理中断异常
e.printStackTrace();
} catch (ExecutionException e) {
// 处理计算异常
e.printStackTrace();
}
}
executor.shutdown(); // 关闭线程池
```
在上面的示例中,我们使用循环提交了10个任务,并通过completionService.take()方法阻塞等待任务完成。一旦有任务完成,我们通过future.get()方法获取任务结果,并进行处理。
请注意,在使用CompletionService时,你无需手动创建Future对象,completionService.submit()方法会自动返回Future对象,你只需关注获取结果即可。
希望这个示例对你有帮助!如果还有其他问题,请随时提问。
阅读全文