CompletableFuture前言
CompletableFuture是JDK1.8提供的异步函数式编程方式的对Future进行了扩展的工具。CompletableFuture分别实现了Future接口以及JDK1.8中新增的接口CompletionStage。Future接口想必并不陌生,Future接口是JDK1,5中提供,可以用于阻塞式获取结果。CompletionStage是用于异步执行中的阶段处理,用于当某个异步阶段执行完成后,完成一个动作或者计算结果,也可能是完成当前异步阶段后触发其他的异步动作。
CompletionStage
一、CompletionStage异步执行阶段表示
CompletionStage异步执行阶段表示可以分别通过:
- applyXXX来表示一个Function,即接受参数返回结果-------->生产型
- acceptXXX来表示一个Consumer,即接收参数不返回结果->消费型
- runXXX来表示一个Runnable,即不接收参数不返回结果---->不生产不消费型
- composeXXX
二、CompletionStage执行时机
按照多个异步执行阶段之间的依赖关系
CompletionStage异步执行阶段 执行时机 取决于使用前缀 **then ** 的方法
- thenXxxBoth或者thenXxxCombine可表示当两个异步阶段都完成后,结合它们的结果或者执行后产生的影响从而触发当前异步阶段
- thenXxxEither可表示当两个异步阶段中任意一个完成之后,触发当前异步阶段
上述可以控制多个阶段之间的依赖关系,但是不保证任何特定的顺序。
根据上一阶段正常执行完成或者异常完成
- whenCompleteXxx 方法表示不管上一阶段是正常完成还是异常完成都会触发当前阶段。此方法仅接收消费型CompletionStage,所以不会记录结果产出。
- handlerXxx 方式也表示不管上一阶段是正常完成还是异常完成都会触发当前阶段。但是它仅接收生产型CompletionStage,所以可以记录产出执行结果
三、CompletionException异常规则
当一个阶段由于发生异常而被终止之后,相关依赖的阶段可通过捕获处理CompletionException异常
1)若当前阶段通过both依赖两个阶段执行时,当依赖两阶段都发生异常时,当前阶段会捕获到的两个阶段中抛出的任意一个CompletionException
2)当通过either依赖两个阶段时,则只要有一个阶段发生异常,该阶段则捕获到CompletionException
3)若当前阶段依赖的阶段都正常完成,而自己本身发生异常,那么当前阶段将以此异常原因异常完成。
四、CompletionStage执行方式
CompletionStage异步执行阶段的执行方式一共有三种:
1)默认executor执行
2)使用了async前缀的方法,表示异步执行
3)使用自定义Executor执行
CompletionStage中所有的方法都遵守上述触发、执行、异常完成的规则。
CompletableFuture
获取结果的方式:
-
get() 阻塞式获取结果
-
get(long timeout, TimeUnit unit)
-
getNow(T valueIfAbsent) 立马返回结果,若任务未完成则返回指定值
-
join()
join和get的相同点都是获取任务执行结果,区别在于get()显示抛出受检异常,需要我们捕获处理,而join()则会将异常包装成CompletionException异常 CancellationException异常,不需要强制开发者抛出或者捕获处理
获取依赖当前state的CompletableFuture数量
- getNumberOfDependents()
网友评论