MST

星途 面试题库

面试题:Java中CompletableFuture在分布式系统并行处理中的基本用法

在分布式系统场景下,简述如何使用Java的CompletableFuture实现两个异步任务并行执行,并在都执行完成后进行结果合并,给出简单代码示例。
47.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 使用CompletableFuture并行执行异步任务并合并结果的原理
    • CompletableFuture是Java 8引入的用于异步编程的类。通过CompletableFuture.supplyAsync方法可以异步执行有返回值的任务。
    • 利用thenCombine方法可以在两个异步任务都完成后,将它们的结果进行合并。
  2. 代码示例
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 第一个异步任务
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
            // 模拟一些计算
            return calculateResult1();
        });

        // 第二个异步任务
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
            // 模拟一些计算
            return calculateResult2();
        });

        // 两个任务都完成后合并结果
        CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (result1, result2) -> {
            // 合并结果的逻辑
            return result1 + result2;
        });

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

    private static int calculateResult1() {
        // 模拟计算
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 10;
    }

    private static int calculateResult2() {
        // 模拟计算
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 20;
    }
}

在上述代码中:

  • CompletableFuture.supplyAsync方法分别启动两个异步任务,calculateResult1calculateResult2模拟了一些实际的计算工作。
  • thenCombine方法将两个异步任务的结果进行合并,这里简单地将两个结果相加。
  • 最后通过get方法获取最终合并的结果。

这种方式在分布式系统场景下很有用,例如可以并行调用多个微服务接口,并在它们都返回结果后进行统一处理。