MST

星途 面试题库

面试题:Java CompletableFuture并行计算中的异常处理

当使用CompletableFuture进行并行计算时,多个异步任务可能会抛出不同类型的异常。请阐述如何统一捕获并处理这些异常,同时确保不影响其他正常任务的执行。请结合代码示例说明。
38.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 统一捕获并处理异常的方法
    • 使用CompletableFutureexceptionally方法或whenComplete方法来处理异常。exceptionally方法专门用于处理异常,而whenComplete方法可以同时处理正常结果和异常情况。这两个方法都不会影响其他正常任务的执行,因为CompletableFuture的设计理念就是异步非阻塞,每个任务相对独立。
  2. 代码示例
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExceptionHandling {
    public static void main(String[] args) {
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
            if (Math.random() < 0.5) {
                throw new RuntimeException("Task 1 failed");
            }
            return 10;
        });

        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
            if (Math.random() < 0.5) {
                throw new RuntimeException("Task 2 failed");
            }
            return 20;
        });

        CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);

        allFutures.join();// 等待所有任务完成

        Integer result1 = future1.exceptionally(ex -> {
            System.out.println("Caught exception in future1: " + ex.getMessage());
            return -1;
        }).join();

        Integer result2 = future2.exceptionally(ex -> {
            System.out.println("Caught exception in future2: " + ex.getMessage());
            return -1;
        }).join();

        System.out.println("Result of future1: " + result1);
        System.out.println("Result of future2: " + result2);
    }
}

在上述代码中:

  • future1future2是两个异步任务,它们都有可能抛出异常。
  • CompletableFuture.allOf(future1, future2)用于等待所有任务完成。
  • 使用exceptionally方法为每个CompletableFuture设置异常处理逻辑,在捕获到异常时打印异常信息并返回一个默认值(这里是-1),这样即使某个任务抛出异常,也不会影响其他任务的执行,并且可以统一处理异常情况。