completablefuture forkjoinpool
时间: 2023-11-24 11:38:46 浏览: 95
CompletableFuture 和 ForkJoinPool 是 Java 中的两个不同的概念。
CompletableFuture 是 Java 8 中引入的一种异步编程方式,它可以让我们更方便地组合多个异步操作,从而减少了回调地狱的问题。CompletableFuture 内部使用了线程池来管理异步操作执行的线程,但是我们并不需要直接操作线程池。
ForkJoinPool 是 Java 7 中引入的一种线程池,它主要用于执行一些分治算法,比如归并排序、快速排序等。ForkJoinPool 内部使用了工作窃取算法来提高线程利用率,也就是说一个线程执行完自己的任务后会去“窃取”其他线程的任务来执行。
虽然 CompletableFuture 内部使用了线程池,但是我们并不需要直接操作线程池,因为 CompletableFuture 内部已经帮我们处理好了线程池的管理。如果我们需要自己创建线程池,可以使用 Executors 工具类来创建。而 ForkJoinPool 则是一种特殊的线程池,它主要用于执行一些特殊的算法,与 CompletableFuture 的使用场景不同。
相关问题
jdk17 CompletableFuture USE_COMMON_POOL
JDK 17 是 Java 语言的一个版本,它引入了一些新的特性和改进,其中之一就是 CompletableFuture 的 USE_COMMON_POOL 选项。CompletableFuture 是 Java 8 引入的一个类,用于支持异步编程。CompletableFuture 的 USE_COMMON_POOL 选项指定 CompletableFuture 在执行异步操作时使用公共线程池(即 ForkJoinPool.commonPool()),而不是使用自己的线程池。这个选项的优点在于可以避免创建大量的线程池,从而提高应用程序的性能。
在 JDK 17 中,CompletableFuture 的 USE_COMMON_POOL 选项默认是开启的。如果你不希望使用公共线程池,可以使用以下语句来关闭它:
```
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "1");
```
这会将公共线程池的并行度设置为 1,从而避免使用公共线程池。
completablefuture 线程池案例
好的,下面是一个使用线程池和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中执行。
阅读全文