一、Future与CompletableFuture对比
-
Future局限:
- 阻塞等待结果(
get()
方法)。 - 无法附加回调函数。
- 不能合并多个Future。
- 缺乏异常处理机制。
- 阻塞等待结果(
-
CompletableFuture优势:
- 提供大量方法以快速创建和链接Future。
- 支持回调函数和全面异常处理。
- 与Java 8的Lambda和Stream API兼容。
- 支持异步编程、函数式编程和响应式编程。
二、创建异步任务
- runAsync:无返回值的异步任务。
- supplyAsync:有返回值的异步任务。
- 线程池:
- 使用
ForkJoinPool.commonPool()
或自定义线程池。 - 避免所有CompletableFuture共享同一线程池。
- 使用
- 异步编程思想:
- 线程创建与任务解耦。
- 异步任务提升性能和响应能力。
三、异步任务的回调
- thenApply:处理并转换结果。
- thenAccept:在Future完成后运行代码,无返回值。
- thenRun:仅接收完成通知,不使用结果。
- 异步回调变体:
thenApplyAsync
、thenAcceptAsync
、thenRunAsync
。- 促进并行计算,可在不同线程执行。
四、异步任务编排
- thenCompose:组合依赖关系异步任务。
- thenCombine:组合非依赖关系异步任务。
- allOf:多个独立异步任务,全部完成后操作。
- anyOf:多个异步任务中任意一个完成即操作。
示例摘要
- 展示了如何使用
CompletableFuture
进行异步操作,例如读取文件和替换文本。 - 演示了如何通过
thenApply
、thenAccept
、thenRun
添加回调处理异步结果。 - 使用
thenCompose
实现任务依赖编排。 - 使用
thenCombine
和allOf
进行多个任务的并行处理。 - 使用
anyOf
实现多个任务中的任一完成即可进行下一步操作。
注意事项
- 避免I/O操作阻塞线程池中的所有线程,造成线程饥饿。
- 根据业务类型创建不同线程池,避免任务互相干扰。
- 异步编程提升性能,但需合理设计线程池和任务调度。
结论
CompletableFuture
是Java并发编程的强大工具,简化了异步编程的复杂性,支持高阶的并发操作。合理使用可以显著提升应用程序的并发处理能力。