MST

星途 面试题库

面试题:Java CompletableFuture在分布式系统中的异常处理

在分布式系统中,使用CompletableFuture进行多个任务并行处理时,若其中一个任务出现异常,如何优雅地捕获并处理该异常,同时不影响其他正常任务的执行,阐述具体思路并给出相关代码实现。
16.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 任务并行执行:使用 CompletableFuture 的静态方法(如 CompletableFuture.allOf)并行执行多个任务。
  2. 异常捕获:为每个 CompletableFuture 任务添加 exceptionally 方法来捕获任务执行过程中的异常,确保异常不会中断其他任务。
  3. 异常处理:在 exceptionally 方法中定义异常处理逻辑,比如记录日志、返回默认值等。

代码实现

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

public class CompletableFutureExceptionHandling {
    public static void main(String[] args) {
        CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
            // 模拟正常任务
            return "Task 1 completed";
        });

        CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {
            // 模拟抛出异常的任务
            throw new RuntimeException("Task 2 failed");
        });

        CompletableFuture<String> task3 = CompletableFuture.supplyAsync(() -> {
            // 模拟正常任务
            return "Task 3 completed";
        });

        CompletableFuture<Void> allTasks = CompletableFuture.allOf(task1, task2, task3);

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

        try {
            System.out.println(task1.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        try {
            System.out.println(task2.exceptionally(ex -> {
                System.out.println("Caught exception in task2: " + ex.getMessage());
                return "Default value for task2";
            }).get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        try {
            System.out.println(task3.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中:

  1. 任务创建task1task2task3 是三个并行执行的任务,其中 task2 会抛出异常。
  2. 并行执行CompletableFuture.allOf 方法用于并行执行这三个任务。
  3. 异常捕获与处理task2 使用 exceptionally 方法捕获异常,并返回一个默认值,确保即使 task2 出现异常,程序仍能继续执行并处理其他任务的结果。