一、同步与异步概念
- 同步:程序执行任务时阻塞当前线程,直到任务完成,后续代码等待任务完成后继续执行。
- 异步:程序执行任务时不阻塞当前线程,任务由其他线程执行,当前线程可继续其他操作,任务完成后通过回调等方式处理结果。
二、使用异步编排的原因
- 异步编排可以提高程序效率,如商品详情页的查询,通过异步化可以显著减少用户等待时间。
三、Java异步编程的演进
- Future:Java 1.5引入,功能简单,无法处理复杂异步任务链。
- 局限性:阻塞获取结果、缺乏组合功能、异常处理复杂。
- CompletableFuture:Java 8引入,提供强大灵活的异步编程支持。
四、CompletableFuture的主要特点
- 表示异步计算结果。
- 提供非阻塞操作。
- 组合多个异步任务。
- 处理异常。
- 构建复杂异步流。
五、CompletableFuture的使用
-
runAsync与supplyAsync
runAsync
:无返回值的异步任务,如日志记录。supplyAsync
:有返回值的异步任务,如获取数据。
-
whenComplete与exceptionally
whenComplete
:无论成功或失败都执行的回调。exceptionally
:仅在异常时执行,处理异常并返回替代结果。
-
whenCompleteAsync与thenApplyAsync
whenCompleteAsync
:异步执行回调。thenApplyAsync
:异步执行并返回新值。
-
thenAccept与thenApply
thenAccept
:处理结果但不返回新值。thenApply
:处理结果并返回新值。
六、异步编排实战案例
- 用线程池和
CompletableFuture
模拟商品详情页查询,优化了执行时间。
七、异步编排使用场景
- 并行调用多个微服务。
- 异步批量处理任务。
- 异步处理用户请求并返回聚合结果。
- 异步执行复杂工作流。
八、总结
- 根据任务是否需要返回结果选择
runAsync
或supplyAsync
。 - 使用
whenComplete
或whenCompleteAsync
在任务完成后执行操作。 - 使用
exceptionally
处理异常。 - 使用
thenAccept
或thenApply
根据需要处理结果。