CompletableFuture除了含有可以直接操作任务状态和结果的方法外,还实现了CompletionStage接口的一些方法。
当CompletableFuture任务完成后,同步使用任务执行线程来执行依赖任务结果的函数或者行为
所有异步的方法在没有显式指定Executor参数的情况下都是复用ForkJoinPool.commonPool()线程池来执行。
所有CompletionStage方法的实现都是相互独立的,以便一个方法的行为不会因为重载了其他方法而受影响。
一个CompletableFuture任务可能有一些依赖其计算结构的行为方法,这些方法被收集到一个无锁基于CAS操作来链接起来的链表组成的栈中。当CompletableFuture的计算任务完成后,会自动弹出栈中的行为方法并执行。由于是栈结构,在同一个CompletableFuture对象上行为注册的顺序与行为执行的顺序是相反的。
在执行时,分三种情况处理:
- 在创建相关依赖的CompletableFuture后,执行相关的action
- 第1步执行失败,则压入Treiber栈中,同下调用
- 第2步失败,则依赖CompletablFuture完成自动调用complete自发处理
1、类图
当涉及到多个步聚时,会通过创建Completion的子类,其中会包含上一步的CompletableFuture,以及当前步骤对应的CompletableFuture,将此Completion放入上一步的stack中。
三个步骤时结构如下图所示