MST

星途 面试题库

面试题:Java中CompletableFuture的whenComplete方法的异常处理及链式调用

假设你有一系列通过CompletableFuture实现的异步任务,任务之间存在依赖关系。请编写代码,使用whenComplete方法处理每个任务完成时的情况,并且在出现异常时能够进行适当的处理,同时展示如何通过链式调用构建复杂的异步任务流程。例如,任务A完成后执行任务B,任务B完成后执行任务C,任何一个任务出现异常都要进行统一的异常处理记录。
14.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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

public class CompletableFutureChaining {

    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            // 模拟任务A
            System.out.println("Task A is running");
            if (Math.random() < 0.5) {
                throw new RuntimeException("Task A failed");
            }
            return "Result of Task A";
        })
       .thenApply(resultA -> {
            // 任务A成功时执行任务B
            System.out.println("Task B is running with result from A: " + resultA);
            if (Math.random() < 0.5) {
                throw new RuntimeException("Task B failed");
            }
            return "Result of Task B";
        })
       .thenApply(resultB -> {
            // 任务B成功时执行任务C
            System.out.println("Task C is running with result from B: " + resultB);
            if (Math.random() < 0.5) {
                throw new RuntimeException("Task C failed");
            }
            return "Result of Task C";
        })
       .whenComplete((result, ex) -> {
            if (ex != null) {
                System.out.println("An exception occurred: " + ex.getMessage());
                // 记录异常,这里简单打印,实际应用可以用日志框架等
                ex.printStackTrace();
            } else {
                System.out.println("Final result: " + result);
            }
        })
       .exceptionally(ex -> {
            System.out.println("Exceptionally handling: " + ex.getMessage());
            ex.printStackTrace();
            return null;
        });

        // 防止主线程退出
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  1. CompletableFuture.supplyAsync 开启一个异步任务,这里模拟任务A。
  2. 使用 thenApply 链式调用,在前一个任务成功完成时执行下一个任务,分别模拟任务B和任务C。
  3. whenComplete 方法用于处理任务完成时的情况,无论是正常完成还是异常完成。如果 ex 不为 null,表示出现异常,进行异常记录处理;否则打印最终结果。
  4. exceptionally 方法也用于异常处理,这里简单打印异常信息并返回 null,在实际应用中可以根据需求进行更复杂的处理。
  5. 最后通过 Thread.sleep 防止主线程退出,以便观察异步任务执行结果。