异步任务调度工具CompleteFeature
CompleteFeature简介
CompleteFeature是对Feature的增强,Feature只能处理简单的异步任务,而CompleteFeature可以将多个异步任务进行复杂的组合,支持串行执行,并行执行,And汇聚,Or汇聚,从而能对复杂的关联任务进行调度。
CompleteFeature支持的业务场景
串行任务
串行任务指任务B要等待任务A执行完成之后才会执行,串行任务有如下属性:
| 属性 | 描述 |
|---|---|
| 可获取 A 的结果 | 任务 B 可获取任务 A 的执行结果作为参数使用 |
| B 有返回值 | 如果任务 B 有返回值,可以将执行结果通过返回值返回 |
| 可获取 A 异常 | 任务 B 可以获取任务 A 抛出的异常 |
| A 异常则终止 | 当任务 A 抛出异常后,程序是否会终止,若会终止,程序将退出,任务 B 不会执行,否则程序不会退出,继续执行 |
CompleteFeature支持的串行任务方法如下:
| 方法 | 可获取 A 的结果 | B 有返回值 | 可获取 A 异常 | A 异常则终止 |
|---|---|---|---|---|
thenRun |
否 | 否 | 否 | 是 |
thenApply |
是 | 是 | 否 | 是 |
thenAccept |
是 | 否 | 否 | 是 |
thenCompose |
是 | 是 | 否 | 是 |
whenComplete |
是 | 否 | 是 | 否 |
exceptionally |
否 | 是 | 是 | 否 |
handle |
是 | 是 | 是 | 否 |
总结:
- 任务不会抛出异常就使用前四个方法,否则使用后三个方法。
exceptionally相当于try {} catch {}的catch部分,whenComplete和handle相当于try {} catch {} finally {}的catch和finall部分,区别是一个有返回值,一个没有返回值。thenApply和thenCompose的区别是,thenCompose在任务 B 中返回的是CompletableFuture,可参考后面的例子对比差异。
And汇聚关系
And汇聚关系是指:任务 C 要等待任务 A 和任务 B 都执行完后才执行。CompleteFeature 支持此关系的方法如下:
| 方法 | C 接收 A 和 B 返回值作为参数 | C 有返回值 |
|---|---|---|
thenCombine |
是 | 是 |
thenAcceptBoth |
是 | 否 |
runAfterBoth |
否 | 否 |
Or汇聚关系
Or 汇聚关系是指:任务 C 等待任务 A 或任务 B 其中一个执行完后就执行,即 C 只需等待最先执行完成的任务后就可执行。CompleteFeature 支持此关系的方法如下:
| 方法 | C 接收 A 或 B 返回值作为参数 | C 有返回值 |
|---|---|---|
applyToEither |
是 | 是 |
acceptEither |
是 | 否 |
runAfterEither |
否 | 否 |
多任务
CompletableFuture 提供了两个多任务的方法:
| 方法 | 描述 |
|---|---|
anyOf |
多个任务中的任意一个任务执行完则结束,可以获取到最先执行完的任务的返回值 |
allOf |
多个任务都执行完后才结束,不能获取到任何一个任务的返回值 |
以上所有方法的返回值都是 CompletableFuture ,这样就可以继续调用前面描述的方法来进行任务组合,组合出更加复杂的任务处理流程。
方法族
以上方法中的最后一个任务都是和前面的任务在一个线程内执行,CompletableFuture中 还有一套方法让最后一个任务在新线程中执行,只要在原方法上加上 Async 后缀则可,例如:
| 同步 | 异步 |
|---|---|
thenApply |
thenApplyAsync |
thenAccept |
thenAcceptAsync |
thenRun |
thenRunAsync |
thenCompose |
thenComposeAsync |
本文转载自: