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