Posted on 2020-07-23 19:29
为自己代言 阅读(838)
评论(0) 编辑 收藏 所属分类:
java/J2EE
JDK 8 中 CompletableFuture 是对 Future 的增强 大大简化了异步编程步骤,在Spring 框架中配合@EnableAsync @Async 更加事办功倍。
1:在JDK 8 之前实现多线必需实现两个接口 Runnable 不带返回值,另一个Callable带返回值的接口,配合ThreadPoolTaskExecutor.submit(Callable callable) 返回一个Future对象。
使用Future获得异步执行结果时,要么调用阻塞方法get(),要么轮询看isDone()是否为true,这两种方法都不是很好,因为主线程也会被迫等待,而CompletableFuture出现改变了这个问题,而且提供更多并且强大的其它功能。
2:CompletableFuture简介
CompletableFuture<T> implements Future<T>, CompletionStage<T>
其实CompletableFuture 除了实现原来的Future 接口外,其它大部分方法都是在CompletionStage中
大致介绍下completableFuture的命名规则:
1:按功能分类的话:
xxx()
:表示该方法将继续在已有的线程中执行;
xxxAsync()
:表示将异步在线程池中执行。
- 异步执行方法默认一个参数的话任务是在
ForkJoinPool.commonPool()
线程池中执行的,带executor 参数的使用 executor线程池异步执行。
2:按逻辑和组织方式来分话(completableFuture 中大约有50个来方法)
- 一种是 then 的逻辑,即前一个计算完成的时候调度后一个计算
- 一种是 both 的逻辑,即等待两个计算都完成之后执行下一个计算,只要能组合一个和另一个,我们就可以无限复用这个 +1 的逻辑组合任意多的计算
- 另一种是 either 的逻辑,即等待两个计算的其中一个完成之后执行下一个计算。注意这样的计算可以说是非确定性的。因为被组合的两个计算中先触发下一个计算执行的那个会被作为前一个计算,而这两个前置的计算到底哪一个先完成是不可预知的
3:从依赖关系和出入参数类型区别,基本分为三类:
- apply 字样的方式意味着组合方式是
Function
,即接受前一个计算的结果,应用函数之后返回一个新的结果
- accept 字样的方式意味着组合方式是
Consumer
,即接受前一个计算的结果,执行消费后不返回有意义的值
- run 字样的方式意味着组合方式是
Runnable
,即忽略前一个计算的结果,仅等待它完成后执行动作
其中出入参数主要有JDK8 Function,Consumer或Runnable三中函数型接口,每一种都决定了是怎么样一种依赖关系,我有一篇文章详细介绍了JDK8函数型接口用法,能有助理解completableFuture方法使用。http://www.blogjava.net/zzzlyr/articles/435611.html4:completableFuture 配合框架使用
因为自从JDK8以后增强了多线程的使用便捷程度:
1:JDk8 的函数式接口和lambda表过式
2:completableFuture 对 Future 类的增强。
这只是JDK 基础包中的功能,现在大部分开发都在使用框架 java 现在基本上都在使用spring框架,因为JDK基础包中的功能还是不如框架使用方便,下边文章详细介绍 springboot中对JDK基础包中多线程功能配置和使用。
http://www.blogjava.net/zzzlyr/articles/435305.html