如何结合ExecutorService不阻塞获取多个Future的返回结果
时间: 2023-08-10 14:30:22 浏览: 47
可以结合使用ExecutorCompletionService和ExecutorService来实现获取多个Future的返回结果,且不会阻塞主线程。
具体实现步骤如下:
1. 创建ExecutorService实例。
2. 创建ExecutorCompletionService实例,并将ExecutorService实例传入。
3. 使用submit方法提交任务到ExecutorCompletionService,它将返回一个Future对象。
4. 使用take方法获取已完成的Future任务的结果。
5. 处理任务结果。
6. 重复步骤3到5,直到所有任务都完成。
下面是一个示例代码:
```java
ExecutorService executorService = Executors.newFixedThreadPool(5);
ExecutorCompletionService<String> completionService = new ExecutorCompletionService<>(executorService);
//提交10个任务
for (int i = 0; i < 10; i++) {
final int index = i;
completionService.submit(() -> {
//模拟一个耗时任务
Thread.sleep((long) (Math.random() * 10000));
return "Task-" + index + " completed";
});
}
//获取任务结果
for (int i = 0; i < 10; i++) {
try {
Future<String> future = completionService.take(); //获取已完成的任务
String result = future.get(); //获取任务结果
System.out.println(result); //处理任务结果
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executorService.shutdown();
```
在这个示例中,我们使用了一个大小为5的线程池来执行10个任务。使用ExecutorCompletionService来获取已完成的任务,并使用Future对象的get方法获取任务结果。最后,我们关闭线程池。