MST

星途 面试题库

面试题:Java 中 CompletableFuture 异步任务回调参数处理之复杂场景

假设你有多个 CompletableFuture 异步任务,其中一个任务依赖于另外两个任务的结果(例如任务 A 和任务 B 的结果相加作为任务 C 的输入)。请使用 CompletableFuture 的相关方法实现这个场景,并处理可能出现的异常情况,用代码详细展示实现过程。
47.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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

public class CompletableFutureExample {
    public static void main(String[] args) {
        // 模拟任务A
        CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> {
            // 模拟一些耗时操作
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return 5;
        });

        // 模拟任务B
        CompletableFuture<Integer> taskB = CompletableFuture.supplyAsync(() -> {
            // 模拟一些耗时操作
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return 3;
        });

        // 任务C依赖于任务A和任务B的结果
        CompletableFuture<Integer> taskC = taskA.thenCombine(taskB, (a, b) -> {
            return a + b;
        }).exceptionally(ex -> {
            System.out.println("任务执行出现异常: " + ex.getMessage());
            return -1; // 返回一个默认值表示异常情况
        });

        // 获取任务C的结果
        try {
            Integer result = taskC.get();
            System.out.println("任务C的结果: " + result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}
  1. 任务A和任务B的创建
    • 使用CompletableFuture.supplyAsync方法创建异步任务taskAtaskB,这两个任务会在不同的线程中执行。
    • 每个任务中通过Thread.sleep模拟了一些耗时操作。
  2. 任务C的创建与依赖
    • 使用taskA.thenCombine(taskB, (a, b) -> {...})方法创建任务taskCthenCombine方法会在taskAtaskB都完成后执行,其传入的函数参数(a, b) -> a + btaskAtaskB的结果相加作为taskC的结果。
    • 使用exceptionally方法处理可能出现的异常情况,如果taskAtaskBthenCombine过程中出现异常,会执行exceptionally中的逻辑,打印异常信息并返回一个默认值-1
  3. 获取任务C的结果
    • 使用taskC.get()获取任务taskC的结果,这里可能会抛出InterruptedExceptionExecutionException,所以需要进行异常处理。

这样就通过CompletableFuture实现了一个任务依赖于另外两个任务结果,并处理了可能出现的异常情况。