详细参考:https://blog.csdn.net/qq_31865983/article/details/106137777
一般api
- supplyAsync() 创建带返回值的异步任务
- ps:第一个参数是个Supplier接口,第二个参数Executor 线程池可以不填,默认是内部指定的common(orkJoinPool.commonPool())线程池,也可以自己指定线程池
- runAsync 创建无返回值的异步任务
- thenApply 表示某个CompletableFuture任务执行完成之后执行下一个任务,即回调方法。
- 有一个参数,是上一个任务的结果。
- 返回一个新任务
- 前后两个任务共用同一个线程。
- thenApplyAsync thenApplyAsync与thenApply的区别在于,前者是将job2提交到线程池中异步执行,实际执行job2的线程可能是另外一个线程,后者是由执行job1的线程立即执行job2,即两个job都是同一个线程执行的。
- 前后两个任务可能同一个也可能不同
- thenAccept 与thenApply类似,只是没有返回新任务
- thenRun 没有参数,也没有返回新任务
- exceptionally 上一个任务异常时执行的方法,会将上一个任务抛出的异常作为入参
- whenComplete 是当某个任务执行完成后执行的回调方法。
- 有两个入参,第一个上一个的任务,第二个是上一个任务可能抛出的异常。
- 如果是正常执行的则传入的第二个参数为null
- 没有返回值
- handle 与whenComplete类似,区别在于有返回值
组合api
-
thenCombine / thenAcceptBoth / runAfterBoth 都是将两个CompletableFuture组合起来,只有这两个都正常执行完了才会执行某个任务
- thenCombine 有返回值,两个任务的执行结果作为方法入参传递到指定方法中
- thenAcceptBoth 无返回值,两个任务的执行结果作为方法入参传递到指定方法中
- runAfterBoth 无返回值,无参数
-
applyToEither / acceptEither / runAfterEither 将两个CompletableFuture组合起来,只要其中一个执行完了就会执行某个任务
- applyToEither 有返回值,执行完成的某个任务作为入参
- acceptEither 无返回值,执行完成的某个任务作为入参
- runAfterEither 无返回值,无入参
-
thenCompose
- 方法会在某个任务执行完成后,将该任务的执行结果作为方法入参
- 有返回值,该方法会返回一个新的CompletableFuture实例。(eg:return CompletableFuture.supplyAsync)
-
allOf / anyOf 对应多个任务,不止2个
- allOf
- 多个任务都执行完成后才会执行,有一个任务异常即终止
- eg:CompletableFuture.allOf(cf,cf2,cf3).whenComplete((a,b)->{})
- 两个入参,第一个是任务的结果,第二个是异常,如果都是正常执行,则null
- anyOf 与allOf的区别是 多个任务只要有一个任务完成就行
- allOf