completablefuture 线程池案例
时间: 2023-06-30 17:26:09 浏览: 100
线程池示例
好的,下面是一个使用线程池和CompletableFuture的案例:
假设我们有一个需要执行的任务列表,我们希望并行执行这些任务并在所有任务完成后进行汇总。使用CompletableFuture和线程池,我们可以实现以下代码:
```
ExecutorService executor = Executors.newFixedThreadPool(10); // 创建线程池,最多同时执行10个任务
List<CompletableFuture<Integer>> futures = new ArrayList<>(); // 用于保存每个任务的CompletableFuture
List<Integer> taskList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 需要执行的任务列表
for (Integer task : taskList) {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { // 使用CompletableFuture执行任务,并将结果包装为CompletableFuture
// 执行任务,这里我们使用一个简单的休眠来模拟任务执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return task * task;
}, executor);
futures.add(future);
}
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])); // 使用CompletableFuture.allOf将所有CompletableFuture合并为一个CompletableFuture
CompletableFuture<List<Integer>> allResults = allFutures.thenApply(v -> { // 当所有任务完成后,使用CompletableFuture.thenApply将结果转换为List<Integer>
return futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
});
List<Integer> results = allResults.join(); // 使用CompletableFuture.join获取最终结果
System.out.println(results); // 打印最终结果
```
在这个例子中,我们使用`CompletableFuture.supplyAsync`方法执行每个任务,并将结果包装为CompletableFuture。然后,我们将所有CompletableFuture合并为一个CompletableFuture,使用`CompletableFuture.allOf`方法。当所有任务完成后,我们使用`CompletableFuture.thenApply`方法将结果转换为List<Integer>。最后,我们使用`CompletableFuture.join`方法获取最终结果。
注意,在这个例子中,我们使用了`ExecutorService`来创建线程池,并将其传递给`CompletableFuture.supplyAsync`方法。这样可以确保任务在线程池中执行,而不是在默认的ForkJoinPool中执行。
阅读全文