MST

星途 面试题库

面试题:Java CompletableFuture如何处理多个异步任务的并发执行与结果合并

假设有多个异步任务,每个任务返回不同类型的结果,使用CompletableFuture如何并发执行这些任务,并将它们的结果合并成一个最终结果?请写出具体的代码示例,并解释关键步骤。
26.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

以下是使用Java的CompletableFuture并发执行多个异步任务并合并结果的代码示例及关键步骤解释:

代码示例

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

public class CompletableFutureExample {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 模拟第一个异步任务,返回String类型结果
        CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
            // 模拟任务执行
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Task 1 result";
        });

        // 模拟第二个异步任务,返回Integer类型结果
        CompletableFuture<Integer> task2 = CompletableFuture.supplyAsync(() -> {
            // 模拟任务执行
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 42;
        });

        // 合并两个任务的结果
        CompletableFuture<String> combinedFuture = task1.thenCombine(task2, (result1, result2) -> {
            return result1 + " and " + result2;
        });

        // 获取最终合并的结果
        String finalResult = combinedFuture.get();
        System.out.println(finalResult);
    }
}

关键步骤解释

  1. 创建异步任务

    • 使用CompletableFuture.supplyAsync方法创建异步任务。supplyAsync接受一个Supplier作为参数,在新的线程中执行Supplierget方法,并返回一个CompletableFuture对象。例如:
    CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
        // 模拟任务执行
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Task 1 result";
    });
    

    这里创建了一个异步任务task1,返回String类型的结果。同样的方式创建了task2,返回Integer类型的结果。

  2. 合并任务结果

    • 使用thenCombine方法将两个CompletableFuture的结果合并。thenCombine接受另一个CompletableFuture和一个BiFunction作为参数。当两个CompletableFuture都完成时,BiFunction会被调用,它的两个参数分别是这两个CompletableFuture的结果,返回值是合并后的结果。例如:
    CompletableFuture<String> combinedFuture = task1.thenCombine(task2, (result1, result2) -> {
        return result1 + " and " + result2;
    });
    

    这里将task1task2的结果合并成一个新的CompletableFuture,类型为String

  3. 获取最终结果

    • 使用get方法阻塞当前线程,直到CompletableFuture完成并获取最终的合并结果。例如:
    String finalResult = combinedFuture.get();
    System.out.println(finalResult);
    

    这里获取到合并后的结果并打印输出。

通过以上步骤,可以使用CompletableFuture并发执行多个异步任务,并将不同类型的结果合并成一个最终结果。