MST

星途 面试题库

面试题:Java CompletableFuture allOf在复杂业务场景下的应用

假设你正在开发一个电商系统,现在有三个异步操作。操作一是查询商品库存,返回库存数量;操作二是查询商品价格,返回价格;操作三是查询商品的促销信息,返回促销信息(如果有)。使用CompletableFuture的allOf方法,在这三个操作都完成后,根据库存数量、价格和促销信息判断是否可以进行促销活动(例如库存大于10,价格小于100且有促销信息则可以进行促销活动),请编写代码实现该功能,要求代码具备良好的可读性和异常处理机制。
20.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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

public class EcommerceSystem {

    // 模拟查询商品库存的异步操作
    public static CompletableFuture<Integer> queryStock() {
        return CompletableFuture.supplyAsync(() -> {
            // 这里模拟实际查询库存的逻辑
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return 15;
        });
    }

    // 模拟查询商品价格的异步操作
    public static CompletableFuture<Double> queryPrice() {
        return CompletableFuture.supplyAsync(() -> {
            // 这里模拟实际查询价格的逻辑
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return 80.0;
        });
    }

    // 模拟查询商品促销信息的异步操作
    public static CompletableFuture<String> queryPromotion() {
        return CompletableFuture.supplyAsync(() -> {
            // 这里模拟实际查询促销信息的逻辑
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "满50减10";
        });
    }

    public static void main(String[] args) {
        CompletableFuture<Integer> stockFuture = queryStock();
        CompletableFuture<Double> priceFuture = queryPrice();
        CompletableFuture<String> promotionFuture = queryPromotion();

        CompletableFuture<Void> allFutures = CompletableFuture.allOf(stockFuture, priceFuture, promotionFuture);

        allFutures.join(); // 等待所有异步操作完成

        try {
            Integer stock = stockFuture.get();
            Double price = priceFuture.get();
            String promotion = promotionFuture.get();

            if (stock > 10 && price < 100 && promotion != null &&!promotion.isEmpty()) {
                System.out.println("可以进行促销活动");
            } else {
                System.out.println("不可以进行促销活动");
            }
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}
  1. 异步操作方法
    • queryStock:模拟查询商品库存,使用CompletableFuture.supplyAsync异步执行,返回库存数量。
    • queryPrice:模拟查询商品价格,同样使用CompletableFuture.supplyAsync异步执行,返回价格。
    • queryPromotion:模拟查询商品促销信息,使用CompletableFuture.supplyAsync异步执行,返回促销信息。
  2. 主线程逻辑
    • 创建三个异步操作的CompletableFuture实例stockFuturepriceFuturepromotionFuture
    • 使用CompletableFuture.allOf方法等待所有异步操作完成。
    • 通过join方法阻塞当前线程,直到所有异步操作完成。
    • 使用get方法获取每个异步操作的结果,并根据设定的条件判断是否可以进行促销活动,同时处理可能出现的InterruptedExceptionExecutionException异常。