MST

星途 面试题库

面试题:Java中CompletableFuture如何处理多个异步任务顺序执行

在Java中,假设你有三个异步任务,任务A返回一个字符串,任务B接收任务A的返回值并进行数字计算,任务C接收任务B的计算结果进行字符串拼接。请使用CompletableFuture实现这三个任务的顺序执行,并简要说明其中涉及的关键方法及其作用。
33.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.concurrent.CompletableFuture;

public class AsyncTaskSequence {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            // 任务A:返回一个字符串
            System.out.println("任务A执行中...");
            return "10";
        })
       .thenApplyAsync(str -> {
            // 任务B:接收任务A的返回值并进行数字计算
            System.out.println("任务B执行中...");
            int num = Integer.parseInt(str);
            return num * 2;
        })
       .thenApplyAsync(result -> {
            // 任务C:接收任务B的计算结果进行字符串拼接
            System.out.println("任务C执行中...");
            return "计算结果是: " + result;
        })
       .thenAccept(System.out::println)
       .exceptionally(ex -> {
            ex.printStackTrace();
            return null;
        });
    }
}

关键方法及其作用

  1. supplyAsync(Supplier supplier):创建一个异步任务,该任务返回一个结果。Supplier 接口定义了一个无参数的方法 get(),用于生成任务的返回值。在上述代码中,任务A通过 supplyAsync 异步执行并返回一个字符串。
  2. thenApplyAsync(Function<? super U,? extends V> fn):接收前一个 CompletableFuture 的结果,并将其作为参数传递给 Function 接口的 apply 方法进行处理,返回一个新的 CompletableFuture。这里任务B和任务C分别使用 thenApplyAsync 接收前一个任务的结果并进行相应处理。
  3. thenAccept(Consumer<? super T> action):接收前一个 CompletableFuture 的结果,并将其传递给 Consumer 接口的 accept 方法进行处理,但不返回新的结果。这里用于打印任务C的最终结果。
  4. exceptionally(Function<Throwable,? extends T> fn):处理 CompletableFuture 执行过程中抛出的异常。如果任务执行过程中出现异常,exceptionally 中的 Function 会被调用,fn 参数为捕获到的异常对象。可以在该方法中进行异常处理并返回一个默认值或进行其他操作。