MST
星途 面试题库

面试题:Java 中 CompletableFuture 多个任务 AND 组合关系下的异常处理

在使用 CompletableFuture 实现多个任务的 AND 组合关系时,如果其中一个任务抛出异常,如何优雅地处理异常,确保其他任务也能正确释放资源,并且可以将异常信息传递给最终的处理逻辑。请结合代码示例说明。
24.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在使用 CompletableFuture 实现多个任务的 AND 组合关系时,可以通过 exceptionally 方法来优雅地处理异常,并确保其他任务也能正确释放资源。以下是代码示例:

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

public class CompletableFutureAndExceptionHandling {

    public static void main(String[] args) {
        CompletableFuture<Void> task1 = CompletableFuture.runAsync(() -> {
            // 模拟任务1
            System.out.println("Task 1 started");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            System.out.println("Task 1 completed");
        });

        CompletableFuture<Void> task2 = CompletableFuture.runAsync(() -> {
            // 模拟任务2,抛出异常
            System.out.println("Task 2 started");
            throw new RuntimeException("Task 2 failed");
        });

        CompletableFuture<Void> combinedTask = CompletableFuture.allOf(task1, task2)
               .exceptionally(ex -> {
                    // 捕获异常,处理资源释放等操作
                    System.out.println("Caught exception: " + ex.getMessage());
                    // 这里可以添加其他任务的资源释放逻辑
                    return null;
                });

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

在上述代码中:

  1. 定义了两个 CompletableFuture 任务 task1task2,其中 task2 会抛出异常。
  2. 使用 CompletableFuture.allOf 方法将两个任务组合起来,实现 AND 关系。
  3. 对组合后的任务 combinedTask 使用 exceptionally 方法,捕获异常并处理,在这个方法中可以添加其他任务的资源释放逻辑。
  4. 最后通过 combinedTask.get() 获取任务执行结果,exceptionally 捕获的异常不会再抛出,而是在 exceptionally 方法内部处理。这样就优雅地处理了异常,并可以确保其他任务的资源释放,同时将异常信息打印出来传递给最终的处理逻辑。