MST

星途 面试题库

面试题:Java CompletableFuture thenCompose性能优化与复杂业务场景应用

假设在一个电商系统中,有一系列复杂的异步任务。首先,需要异步查询商品库存(模拟为一个返回库存数量的CompletableFuture任务)。如果库存数量大于10,使用thenCompose方法发起一个新的异步任务,该任务模拟向用户推荐相关商品(返回推荐商品列表)。如果库存数量小于等于10,使用thenCompose方法发起另一个异步任务,该任务模拟生成补货提醒(返回提醒信息)。请考虑性能优化,例如使用合适的线程池来执行这些异步任务,避免线程资源的浪费,并且在整个过程中妥善处理各种异常情况,编写完整的Java代码实现该业务逻辑。
24.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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

public class EcommerceAsyncTasks {

    // 创建一个固定大小的线程池,根据实际情况调整大小
    private static final ExecutorService executorService = Executors.newFixedThreadPool(10);

    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> queryProductStock(), executorService)
               .thenCompose(stock -> {
                    if (stock > 10) {
                        return recommendRelatedProducts(stock);
                    } else {
                        return generateRestockReminder(stock);
                    }
                })
               .thenAccept(result -> System.out.println("Result: " + result))
               .exceptionally(ex -> {
                    System.err.println("An error occurred: " + ex.getMessage());
                    return null;
                })
               .whenComplete((result, ex) -> {
                    executorService.shutdown();
                });
    }

    private static int queryProductStock() {
        // 模拟查询商品库存的异步任务
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return (int) (Math.random() * 20);
    }

    private static CompletableFuture<String> recommendRelatedProducts(int stock) {
        return CompletableFuture.supplyAsync(() -> {
            // 模拟向用户推荐相关商品的异步任务
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "Recommended products for stock " + stock;
        }, executorService);
    }

    private static CompletableFuture<String> generateRestockReminder(int stock) {
        return CompletableFuture.supplyAsync(() -> {
            // 模拟生成补货提醒的异步任务
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "Restock reminder for stock " + stock;
        }, executorService);
    }
}
  1. 线程池:创建了一个固定大小的线程池 executorService,使用 Executors.newFixedThreadPool(10) 来避免创建过多线程导致资源浪费。
  2. 异步任务
    • queryProductStock 方法模拟查询商品库存,通过 TimeUnit.SECONDS.sleep(1) 模拟异步操作。
    • recommendRelatedProductsgenerateRestockReminder 方法分别模拟推荐商品和生成补货提醒的异步任务,同样使用 TimeUnit.SECONDS.sleep(1) 模拟耗时操作。
  3. 业务逻辑
    • CompletableFuture.supplyAsync(() -> queryProductStock(), executorService) 启动查询商品库存的异步任务,并使用线程池执行。
    • thenCompose 根据库存数量决定后续异步任务,大于10执行推荐商品任务,小于等于10执行生成补货提醒任务。
    • thenAccept 处理最终结果并打印。
    • exceptionally 捕获并处理过程中发生的异常。
    • whenComplete 在任务完成后关闭线程池。