获取双异步返回值时 如何保证主线程不阻塞?(3)
获取双异步返回值时

2、thenAccept
thenAccept()接受参数,没有返回值。
supplyAsync + thenAccept
- 异步线程顺序执行
- supplyAsync的异步返回值,可以作为thenAccept的参数使用
- 不会阻塞主线程
CompletableFuture.supplyAsync(new Supplier<Integer>() {
@Override
public Integer get() {
return readExcelDbJdk8Service.readXlsCacheAsyncMybatis();
}
}).thenAccept(x -> logger.info(".thenAccept()方法测试:" + x));
但是,此时无法通过completableFuture.get()获取supplyAsync的返回值了。
3、thenApply
thenApply在thenAccept的基础上,可以再次通过completableFuture.get()获取返回值。
supplyAsync + thenApply,典型的链式编程。
- 异步线程内方法顺序执行
- supplyAsync 的返回值,作为第 1 个thenApply的参数,进行业务处理
- 第 1 个thenApply的返回值,作为第 2 个thenApply的参数,进行业务处理
- 最后,通过future.get()方法获取最终的返回值
CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(new Supplier<Integer>() {
@Override
public Integer get() {
return readExcelDbJdk8Service.readXlsCacheAsyncMybatis();
}
}).thenApply((result) -> {
return thenApplyTest2(result);// supplyAsync返回值 * 2
}).thenApply((result) -> {
return thenApplyTest5(result);// thenApply返回值 * 5
});
logger.info("readXlsCacheAsyncMybatis插入数据 * 2 * 5 = " + completableFuture.get());
七、CompletableFuture合并任务
- thenCombine,多个异步任务并行处理,有返回值,最后合并结果返回新的CompletableFuture对象;
- thenAcceptBoth,多个异步任务并行处理,无返回值;
- acceptEither,多个异步任务并行处理,无返回值;
- applyToEither,,多个异步任务并行处理,有返回值;
CompletableFuture合并任务的代码实例,这里就不多赘述了,一些语法糖而已,大家切记陷入低水平勤奋的怪圈。
八、CompletableFuture VS Future总结
本文中以下几个方面对比了CompletableFuture和Future的差异:
- ForkJoinPool和ThreadPoolExecutor的实现原理,探索了CompletableFuture和Future的差异;
- 通过代码实例的形式简单介绍了CompletableFuture中花俏的语法糖;
- 通过CompletableFuture优化了 “通过Future获取异步返回值”;
- 通过CompletableFuture.allOf解决阻塞主线程问题。
Future提供了异步执行的能力,但Future.get()会通过轮询的方式获取异步返回值,get()方法还会阻塞主线程。
轮询的方式非常消耗CPU资源,阻塞的方式显然与我们的异步初衷背道而驰。
JDK8提供的CompletableFuture实现了Future接口,添加了很多Future不具备的功能,比如链式编程、异常处理回调函数、获取异步结果不阻塞不轮询、合并异步任务等。
获取异步线程结果后,我们可以通过添加事务的方式,实现Excel入库操作的数据一致性。
以上是IT袋网网关于获取双异步返回值时 及其 如何保证主线程不阻塞的全部内容,您了解了吗?
相关阅读
-
创建自己的个人网站怎么弄 网页设计制作网站
小编为大家讲一讲创建自己的个人网站怎么弄和网页设计制作网站的方法内容,很不错的方法小知识,建议收藏哦! 随着个人创业的流行,很多个人也需要一个比较详细的网站来展示自己,开
-
Nginx面试题及答案精选:提升你的Web服务器技术水平
小编为你介绍Nginx面试题及答案精选的相关介绍,继续往下看吧! 1. Nginx基础知识 1.1 什么是Nginx? Nginx是一款开源且高性能、稳定、低资源消耗、高并发的HTTP和反向代理服务器,也是一个非常
-
免费备案二级域名分发解析 永久免费已备案二级域名注册
今天为大家介绍免费备案二级域名分发解析和永久免费已备案二级域名注册的IT知识,一起来了解了解吧。 想要制作一个网站,域名是必不可少的。每个网站都有独一无二的域名,那么新手该
-
SAN存储区域网络特点 特征概述:SAN存储网络的独特之处
下面为网友们详细介绍SAN存储区域网络特点的介绍,一定能解决您的问题的,一起来了解吧! SAN(Storage Area Network)是一种专门用于连接存储设备和服务器的网络架构。 其核心组成部分包括存


