MST
星途 面试题库

面试题:Java CompletableFuture 如何处理异常及实现回调

假设你正在使用 CompletableFuture 进行一系列异步任务,当其中某个任务出现异常时,如何优雅地捕获并处理这个异常?同时,如何在任务完成后添加回调操作以执行特定逻辑?请编写代码示例来展示。
44.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

以下是使用CompletableFuture处理异常并添加回调操作的代码示例:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            if (Math.random() < 0.5) {
                throw new RuntimeException("任务出现异常");
            }
            return "任务成功完成";
        })
        .exceptionally(ex -> {
            System.out.println("捕获到异常: " + ex.getMessage());
            return "默认值";
        })
        .thenAccept(result -> {
            System.out.println("回调操作: " + result);
        });

        // 主线程等待所有异步任务完成
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  1. 异常处理:使用exceptionally方法捕获异步任务中的异常。在exceptionally的回调函数中,可以对异常进行处理,并返回一个默认值或进行其他操作。
  2. 回调操作:使用thenAccept方法在任务完成(无论是正常完成还是异常完成)后添加回调操作。thenAccept的回调函数接收任务的结果(如果任务正常完成)或exceptionally返回的默认值(如果任务异常完成),并执行特定逻辑。

在上述示例中,supplyAsync方法启动一个异步任务。如果任务抛出异常,exceptionally捕获异常并输出异常信息,同时返回默认值。然后thenAccept接收任务结果或默认值并执行回调逻辑。为了确保主线程等待异步任务完成,使用Thread.sleep方法暂停主线程2秒。实际应用中,可以根据需求采用更合适的方式确保异步任务执行完毕。