CompletableFuture 是 Java 8 引入的一个类,用于支持异步编程。它实现了 Future 接口,并提供了非常强大的功能来处理异步操作。下面是 CompletableFuture 的一些关键内部方法及其详细解释。
基础方法
- supplyAsync(Supplier supplier):异步执行一个任务,并返回一个包含任务结果的 CompletableFuture。Supplier 是一个可以返回结果的函数接口。
- runAsync(Runnable runnable):异步执行一个任务,不返回结果,返回一个 CompletableFuture
- thenApply(Function super T,? extends U> fn):当 CompletableFuture 计算完成后,应用一个函数到结果上,并返回一个新的 CompletableFuture。
- thenAccept(Consumer super T> action):当 CompletableFuture 计算完成后,执行一个操作并消费结果,但不返回新的 CompletableFuture。
- thenRun(Runnable action):当 CompletableFuture 计算完成后,运行一个 Runnable,但不使用 CompletableFuture 的结果,也不返回新的 CompletableFuture。
组合方法
- thenCombine(CompletionStage extends U> other, BiFunction super T,? super U,? extends V> fn):当两个 CompletableFuture 都完成后,应用一个函数到两个结果上,并返回一个新的 CompletableFuture。
- thenCompose(Function super T,? extends CompletionStage> fn):当第一个 CompletableFuture 完成后,应用一个函数到结果上,返回一个新的 CompletableFuture。
- allOf(CompletableFuture>... cfs):返回一个新的 CompletableFuture,当所有给定的 CompletableFuture 完成后,它也完成。
- anyOf(CompletableFuture>... cfs):返回一个新的 CompletableFuture,当任意一个给定的 CompletableFuture 完成后,它也完成。
异常处理方法
- handle(BiFunction super T, Throwable, ? extends U> fn):当 CompletableFuture 完成时,无论是正常还是异常完成,应用一个处理函数到结果或异常上,并返回一个新的 CompletableFuture。
- exceptionally(Function
实例详解
下面是一个使用 CompletableFuture 的实例代码:
- import java.util.concurrent.CompletableFuture;
- import java.util.concurrent.ExecutionException;
-
- public class CompletableFutureExample {
- public static void main(String[] args) throws InterruptedException, ExecutionException {
- // 使用 supplyAsync 创建一个异步任务
- CompletableFuture
future = CompletableFuture.supplyAsync(() -> { - try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return "Hello";
- });
-
- // thenApply 在前一个任务完成后应用一个函数
- CompletableFuture
resultFuture = future.thenApply(result -> result + " World"); -
- // get() 方法阻塞,直到计算完成
- String result = resultFuture.get();
- System.out.println(result); // 输出 "Hello World"
- }
- }
解释
1. 创建异步任务:
- java
- CompletableFuture
future = CompletableFuture.supplyAsync(() -> { - try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return "Hello";
- });
这段代码创建了一个异步任务,经过 2 秒钟后返回字符串 "Hello"。
2. 应用函数:
CompletableFuture resultFuture = future.thenApply(result -> result + " World");
当第一个 CompletableFuture 完成后,thenApply 方法应用一个函数,将结果 "Hello" 变为 "Hello World"。
3. 获取结果:
String result = resultFuture.get();
get() 方法阻塞当前线程,直到 CompletableFuture 计算完成,并返回结果 "Hello World"。
CompletableFuture 提供了丰富的方法来处理异步编程的各种场景。它们的组合和使用可以使得异步代码更加简洁和易于理解。