
参考面试回答:
个人理解
CompletableFuture
是 Java 8 引入的一个类、它可以让我们在多线程环境中更加容易地处理异步任务。CompletableFuture
的底层原理是基于一个名为 FutureTask 的机制、结合了 监听器 模式 和 等待-通知机制 来处理异步计算。
1.首先就是CompletableFuture
实现了 Future
接口:
这意味着 可以像 Future
一样、用于获取异步计算的结果、检查计算状态等。以及内部使用了 FutureTask
: FutureTask
是 Future
接口的一个实现类、它可以包装一个 Callable
对象、并在后台线程中执行 Callable
的 call()
方法。 FutureTask
负责管理任务的状态、存储计算结果或异常,并提供同步等待的机制。
2.然后核心的两个字段:
result
字段:
-
它有多个状态、通常是
未完成
、已完成正常
、已完成异常
、已取消
等。它通过一个volatile
变量来保持任务的执行状态。用于存储异步计算的结果。如果计算过程中发生异常result
会存储异常对象。 -
任务完成后、通过调用
complete()
方法来更新状态、并通知等待的线程。
然后就是
stack
字段:
- 这是一个
Completion
类型的链表、也称为依赖链。 每个Completion
对象代表一个待触发的依赖任务、例如thenApply
、thenAccept
等方法创建的任务。stack
链表将这些任务串联起来,形成任务编排的流水线。
3.然后介绍一下监听器模式:
-
CompletableFuture
支持链式调用(例如:thenApply
、thenAccept
等)、这些方法为某个任务注册了回调函数(监听器)。回调函数会在任务完成后执行。内部通过Listener
机制实现、使用synchronized
或CAS
来保证线程安全。 -
以及这些回调通常会通过
Executor
执行。CompletableFuture
支持使用默认的线程池(ForkJoinPool
)来执行这些任务、也可以自定义线程池。
4.与 Future
的区别:
CompletableFuture
相比于传统的 Future
,提供了更强大的功能,例如链式调用、异常处理、组合操作等,使得异步编程更加灵活和方便。
我个人觉得这个的内容太多 我先放一个面试回答 后续补充内容