MST

星途 面试题库

面试题:Java 中 CompletableFuture AnyOf 关系与复杂业务场景结合

在一个电商系统中,有以下几个异步任务:任务A查询商品库存,返回库存数量;任务B查询商品价格,返回价格;任务C查询商品的促销信息,返回促销规则字符串。使用 CompletableFuture 的 anyOf 方法实现,如果在100毫秒内任意一个任务完成,就根据完成任务的类型执行相应的后续处理(例如库存为0时返回商品缺货信息,价格获取到后计算折扣价格,促销信息获取到后展示促销内容)。如果100毫秒内所有任务都未完成,则返回提示用户稍等的信息。请编写高效且优雅的Java代码实现该功能,并分析代码的性能和可扩展性。
18.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.concurrent.*;

public class EcommerceAsyncTasks {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> {
            // 模拟查询商品库存
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return 10;
        }, executorService);

        CompletableFuture<Double> taskB = CompletableFuture.supplyAsync(() -> {
            // 模拟查询商品价格
            try {
                Thread.sleep(150);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return 100.0;
        }, executorService);

        CompletableFuture<String> taskC = CompletableFuture.supplyAsync(() -> {
            // 模拟查询商品促销信息
            try {
                Thread.sleep(180);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "满100减20";
        }, executorService);

        CompletableFuture<?> anyOfFuture = CompletableFuture.anyOf(taskA, taskB, taskC);

        CompletableFuture<String> resultFuture = anyOfFuture.applyToEither(
                CompletableFuture.delayedFuture(100, TimeUnit.MILLISECONDS),
                completedFuture -> {
                    if (completedFuture == taskA) {
                        int stock = taskA.join();
                        return stock == 0? "商品缺货" : "库存数量: " + stock;
                    } else if (completedFuture == taskB) {
                        double price = taskB.join();
                        double discountPrice = price * 0.8; // 假设8折
                        return "折扣价格: " + discountPrice;
                    } else {
                        String promotion = taskC.join();
                        return "促销内容: " + promotion;
                    }
                }
        );

        resultFuture.thenAccept(System.out::println).join();

        executorService.shutdown();
    }
}

性能分析

  1. 并发执行:使用 CompletableFuture.supplyAsync 方法将任务提交到线程池,使得任务A、B、C可以并发执行,提高了整体的执行效率。
  2. 超时控制:通过 CompletableFuture.delayedFuture(100, TimeUnit.MILLISECONDS) 设置了100毫秒的超时时间,避免了长时间等待任务完成,提高了系统的响应速度。

可扩展性分析

  1. 易于添加任务:如果需要添加新的异步任务,只需要创建新的 CompletableFuture 并添加到 CompletableFuture.anyOf 方法中即可,代码结构清晰,易于维护和扩展。
  2. 线程池管理:使用 ExecutorService 管理线程池,可以根据系统资源和任务负载调整线程池的大小,提高系统的可扩展性和稳定性。同时,在任务完成后及时关闭线程池,避免资源浪费。