MST
星途 面试题库

面试题:Java的CompletableFuture如何实现异步任务的顺序编排

假设你有一系列的异步任务,任务B需要在任务A完成后执行,任务C需要在任务B完成后执行,使用CompletableFuture如何实现这种顺序编排,并且在每个任务执行失败时能够进行恰当的异常处理,用代码示例说明。
24.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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

public class CompletableFutureSequentialExecution {
    public static void main(String[] args) {
        CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
            // 模拟任务A
            System.out.println("任务A开始执行");
            if (Math.random() < 0.5) {
                throw new RuntimeException("任务A执行失败");
            }
            System.out.println("任务A执行成功");
            return "任务A的结果";
        })
       .thenApplyAsync(result -> {
            // 任务B依赖任务A的结果
            System.out.println("任务B开始执行,依赖任务A的结果: " + result);
            if (Math.random() < 0.5) {
                throw new RuntimeException("任务B执行失败");
            }
            System.out.println("任务B执行成功");
            return "任务B的结果";
        })
       .thenAcceptAsync(result -> {
            // 任务C依赖任务B的结果
            System.out.println("任务C开始执行,依赖任务B的结果: " + result);
            if (Math.random() < 0.5) {
                throw new RuntimeException("任务C执行失败");
            }
            System.out.println("任务C执行成功");
        })
       .exceptionally(ex -> {
            // 全局异常处理
            System.out.println("发生异常: " + ex.getMessage());
            return null;
        });

        try {
            future.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

上述代码中:

  1. CompletableFuture.supplyAsync 方法创建并异步执行任务A,在任务A中模拟了可能的失败情况。
  2. thenApplyAsync 方法依赖任务A的结果,执行任务B,并同样模拟了任务B可能的失败情况。
  3. thenAcceptAsync 方法依赖任务B的结果,执行任务C,也模拟了任务C可能的失败情况。
  4. exceptionally 方法对整个任务链中的异常进行统一处理,在异常发生时打印异常信息。最后通过 future.get() 获取最终结果,这里主要是为了等待任务执行完成。