completablefuture forkjoinpool
时间: 2023-11-24 11:38:46 浏览: 42
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类本身并没有绑定特定的线程池。它默认使用ForkJoinPool.commonPool()作为其执行异步任务的线程池。commonPool()是一个公共的ForkJoinPool线程池,它被Java的并发框架广泛使用。
但是,你也可以通过使用supplyAsync()和runAsync()等方法的重载版本来指定自定义的线程池。这些方法允许你传递一个Executor参数,以便在执行异步任务时使用特定的线程池。
例如,你可以这样使用自定义线程池:
```java
ExecutorService customThreadPool = Executors.newFixedThreadPool(10);
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 异步任务逻辑
}, customThreadPool);
```
这样,你就可以在CompletableFuture中使用自定义的线程池来执行异步任务。