CompletableFuture方法介绍及代码示例

发布于:2024-06-16 ⋅ 阅读:(22) ⋅ 点赞:(0)

CompletableFuture 是 Java 8 引入的一个类,用于支持异步编程。它实现了 Future 接口,并提供了非常强大的功能来处理异步操作。下面是 CompletableFuture 的一些关键内部方法及其详细解释。

 基础方法

1. supplyAsync 和 runAsync:

         - supplyAsync(Supplier<U> supplier):异步执行一个任务,并返回一个包含任务结果的 CompletableFuture。Supplier 是一个可以返回结果的函数接口。
   - runAsync(Runnable runnable):异步执行一个任务,不返回结果,返回一个 CompletableFuture<Void>。

2. thenApply 和 thenAccept:

        - thenApply(Function<? super T,? extends U> fn):当 CompletableFuture 计算完成后,应用一个函数到结果上,并返回一个新的 CompletableFuture。
   - thenAccept(Consumer<? super T> action):当 CompletableFuture 计算完成后,执行一个操作并消费结果,但不返回新的 CompletableFuture。

3. thenRun:

         - thenRun(Runnable action):当 CompletableFuture 计算完成后,运行一个 Runnable,但不使用 CompletableFuture 的结果,也不返回新的 CompletableFuture。

 组合方法

4. thenCombine 和 thenCompose:

        - thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn):当两个 CompletableFuture 都完成后,应用一个函数到两个结果上,并返回一个新的 CompletableFuture。
   - thenCompose(Function<? super T,? extends CompletionStage<U>> fn):当第一个 CompletableFuture 完成后,应用一个函数到结果上,返回一个新的 CompletableFuture。

5. allOf 和 anyOf:

         - allOf(CompletableFuture<?>... cfs):返回一个新的 CompletableFuture,当所有给定的 CompletableFuture 完成后,它也完成。
   - anyOf(CompletableFuture<?>... cfs):返回一个新的 CompletableFuture,当任意一个给定的 CompletableFuture 完成后,它也完成。

 异常处理方法

6. handle 和 exceptionally:

        - handle(BiFunction<? super T, Throwable, ? extends U> fn):当 CompletableFuture 完成时,无论是正常还是异常完成,应用一个处理函数到结果或异常上,并返回一个新的 CompletableFuture。
   - exceptionally(Function<Throwable, ? extends T> fn):当 CompletableFuture 异常完成时,应用一个函数到异常上,返回一个新的 CompletableFuture。

 实例详解

下面是一个使用 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<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Hello";
        });

        // thenApply 在前一个任务完成后应用一个函数
        CompletableFuture<String> resultFuture = future.thenApply(result -> result + " World");

        // get() 方法阻塞,直到计算完成
        String result = resultFuture.get();
        System.out.println(result); // 输出 "Hello World"
    }
}


 解释

1. 创建异步任务:

   java
   CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
       try {
           Thread.sleep(2000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       return "Hello";
   });

这段代码创建了一个异步任务,经过 2 秒钟后返回字符串 "Hello"。

2. 应用函数:

CompletableFuture<String> resultFuture = future.thenApply(result -> result + " World");

        当第一个 CompletableFuture 完成后,thenApply 方法应用一个函数,将结果 "Hello" 变为 "Hello World"。

3. 获取结果:

String result = resultFuture.get();


   get() 方法阻塞当前线程,直到 CompletableFuture 计算完成,并返回结果 "Hello World"。

CompletableFuture 提供了丰富的方法来处理异步编程的各种场景。它们的组合和使用可以使得异步代码更加简洁和易于理解。