MST

星途 面试题库

面试题:Java CompletableFuture thenAccept在分布式任务结果收集场景下的应用

在一个分布式系统中,有多个子任务并行执行,每个子任务返回一个订单处理结果。这些子任务执行完毕后,需要将所有结果汇总并进行统一的后续处理,例如计算总金额、统计订单数量等。请使用CompletableFuture的thenAccept方法设计一个解决方案,说明如何处理可能出现的异常情况,并给出主要的代码框架。
42.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代码框架

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

class OrderResult {
    // 假设订单结果类包含金额等属性
    private double amount;

    public OrderResult(double amount) {
        this.amount = amount;
    }

    public double getAmount() {
        return amount;
    }
}

public class DistributedOrderProcessing {
    public static void main(String[] args) {
        List<CompletableFuture<OrderResult>> futures = new ArrayList<>();
        // 模拟多个子任务,创建CompletableFuture对象并添加到列表中
        for (int i = 0; i < 5; i++) {
            CompletableFuture<OrderResult> future = CompletableFuture.supplyAsync(() -> {
                // 模拟子任务处理,可能抛出异常
                if (Math.random() < 0.1) {
                    throw new RuntimeException("Sub - task failed");
                }
                return new OrderResult(Math.random() * 100);
            });
            futures.add(future);
        }

        CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
        allFutures.thenAccept((v) -> {
            double totalAmount = 0;
            int orderCount = 0;
            for (CompletableFuture<OrderResult> future : futures) {
                try {
                    OrderResult result = future.get();
                    totalAmount += result.getAmount();
                    orderCount++;
                } catch (Exception e) {
                    // 处理子任务异常
                    System.out.println("Exception occurred in sub - task: " + e.getMessage());
                }
            }
            System.out.println("Total amount: " + totalAmount);
            System.out.println("Order count: " + orderCount);
        }).exceptionally((e) -> {
            // 处理allOf操作本身的异常
            System.out.println("Exception in allOf operation: " + e.getMessage());
            return null;
        });
    }
}

异常处理说明

  1. 子任务异常:在每个子任务的supplyAsync中,如果子任务执行时抛出异常,在thenAccept的遍历中,通过future.get()获取结果时会捕获到异常,并在catch块中进行处理,这里简单打印异常信息。
  2. allOf操作异常:使用exceptionally方法处理allOf操作本身可能出现的异常,例如在添加到allOfCompletableFuture对象中有已经处于异常完成状态的情况,这里同样简单打印异常信息。