MST

星途 面试题库

面试题:Java CompletableFuture thenRun的复杂场景应用

假设有多个CompletableFuture任务,每个任务都会返回一个整数结果。请使用thenRun方法,在所有任务完成后,计算并打印出这些结果的总和。要求处理任务执行过程中可能出现的异常,并展示如何优雅地处理异常情况。
46.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureSumExample {
    public static void main(String[] args) {
        List<CompletableFuture<Integer>> futures = new ArrayList<>();

        // 模拟添加多个CompletableFuture任务
        futures.add(CompletableFuture.supplyAsync(() -> {
            // 模拟一些计算
            return 10;
        }));
        futures.add(CompletableFuture.supplyAsync(() -> {
            // 模拟一些计算
            return 20;
        }));
        futures.add(CompletableFuture.supplyAsync(() -> {
            // 模拟抛出异常
            throw new RuntimeException("模拟异常");
        }));

        CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));

        allFutures.thenRun(() -> {
            int sum = 0;
            for (CompletableFuture<Integer> future : futures) {
                try {
                    sum += future.get();
                } catch (InterruptedException | ExecutionException e) {
                    // 优雅地处理异常,这里可以记录日志等
                    System.out.println("处理任务异常: " + e.getMessage());
                }
            }
            System.out.println("结果总和: " + sum);
        }).exceptionally(ex -> {
            // 处理allOf过程中的异常
            System.out.println("处理allOf异常: " + ex.getMessage());
            return null;
        });
    }
}
  1. 创建任务列表:首先创建一个List<CompletableFuture<Integer>>来存储所有的任务。
  2. 添加任务:向列表中添加多个CompletableFuture任务,这些任务会异步执行并返回整数结果。其中一个任务模拟抛出异常。
  3. 使用allOf等待所有任务完成CompletableFuture.allOf方法会返回一个新的CompletableFuture,当所有传入的CompletableFuture都完成时,这个新的CompletableFuture也完成。
  4. 在所有任务完成后计算总和:使用thenRun方法,在所有任务完成后执行计算总和的操作。在计算总和过程中,使用try - catch块捕获每个任务可能抛出的异常并进行处理。
  5. 处理allOf过程中的异常:使用exceptionally方法,处理allOf过程中可能出现的异常,例如某个任务执行时出现了未处理的异常导致allOf失败。