MST

星途 面试题库

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

假设你正在开发一个电商系统,有一个需求是当用户下单成功后,需要异步更新库存、记录订单日志并且给用户发送通知。请使用CompletableFuture的thenAccept方法来实现这个业务逻辑,并阐述这种实现方式相较于其他异步处理方式(如线程池配合Callable),在代码维护和扩展性方面的优势。
47.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

使用CompletableFuture的thenAccept方法实现

import java.util.concurrent.CompletableFuture;

public class EcommerceSystem {

    public static void main(String[] args) {
        // 模拟下单成功
        CompletableFuture.supplyAsync(() -> "Order Placed Successfully")
               .thenAccept(orderResult -> updateInventory())
               .thenAccept(unused -> recordOrderLog())
               .thenAccept(unused -> sendNotificationToUser());
    }

    private static void updateInventory() {
        System.out.println("Inventory updated.");
    }

    private static void recordOrderLog() {
        System.out.println("Order log recorded.");
    }

    private static void sendNotificationToUser() {
        System.out.println("Notification sent to user.");
    }
}

CompletableFuture在代码维护和扩展性方面的优势

  1. 代码维护
    • 链式调用:使用thenAccept等方法,可以通过链式调用的方式将多个异步操作串联起来,代码结构清晰,易于理解和维护。相比之下,线程池配合Callable需要手动管理线程的提交、结果获取等操作,代码较为繁琐。
    • 异常处理CompletableFuture提供了统一的异常处理机制,如exceptionally方法,可以在链式调用的末尾统一处理异常,而在线程池配合Callable中,异常处理需要在每个Callable任务内部单独处理,增加了代码的复杂性。
  2. 扩展性
    • 组合操作CompletableFuture支持多种组合操作,如thenCombineallOfanyOf等。这使得在处理复杂的异步任务依赖关系时更加方便,例如,如果需要在更新库存和记录订单日志都完成后再发送通知,可以很容易地使用thenCombine来实现。而线程池配合Callable实现类似功能则需要更多的手动协调和管理。
    • 并行处理CompletableFuture可以方便地实现并行处理多个异步任务,并在所有任务完成后进行统一的后续操作。例如,可以使用CompletableFuture.allOf方法等待多个库存更新任务完成后再继续下一步操作,这种灵活性在扩展性方面具有很大优势。