CompletionService用法
时间: 2023-08-21 22:02:36 浏览: 102
`CompletionService` 是 Java 中用于异步执行多个任务并获取结果的工具类,它可以帮助我们更方便地实现线程池的任务提交和结果获取。它的用法如下:
1. 创建 `ExecutorService` 线程池对象:
```java
ExecutorService executorService = Executors.newFixedThreadPool(10);
```
2. 创建 `CompletionService` 对象,传入上面创建的线程池对象:
```java
CompletionService<String> completionService = new ExecutorCompletionService<>(executorService);
```
3. 提交任务到线程池中,并将任务的执行结果提交到 `CompletionService` 中:
```java
for (int i = 0; i < 10; i++) {
int finalI = i;
completionService.submit(() -> {
// 模拟任务执行
Thread.sleep(new Random().nextInt(1000));
return "task-" + finalI;
});
}
```
这里提交了 10 个任务,每个任务随机延迟 0~1000 毫秒,并返回一个字符串结果。
4. 获取任务的执行结果,这里使用 `take()` 方法,它将阻塞等待第一个任务执行完成并返回结果:
```java
for (int i = 0; i < 10; i++) {
String result = completionService.take().get();
System.out.println(result);
}
```
这里循环获取 10 个结果,`take()` 方法将阻塞等待第一个任务执行完成并返回结果,然后输出结果。
`CompletionService` 的优点在于,它可以让我们更方便地获取任务的执行结果,而不必使用繁琐的 `Future` 对象来管理每个任务的执行状态。此外,它还可以让我们更方便地处理任务的执行异常,只需要在任务的执行代码中抛出异常即可,在获取结果时使用 `try-catch` 块来捕获异常即可。
阅读全文