深入源码,CompletableFuture 简单与链式的区别?
导读:从 JDK 8 开始,在 Concurrent 包中提供了一个强大的异步编程工具 CompletableFuture。在 JDK8 之前,异步编程可以通过线程池和 Future 来实现,但功能还不够强大。CompletableFuture 的出现,使 Java 的异编程能力向前迈进了一大步。在探讨 CompletableFuture 的原理之前,先详细看一下 CompletableFuture 的用法,从这些用法中,可以看到相较之前的 Future 有哪些能力得到了提升。
提交给 CompletableFuture 执行的任务 有四种类型:Runnable、Consumer、Supplier、Function。简单说明这四种任务原型的对比。
runAsync 与 supplierAsync 是 CompletableFutre 的静态方法;
而 thenAccept、thenAsync、thenApply 是 CompletableFutre 的成员方法 因为初始的时候没有 CompletableFuture 对象,也没有参数可传,所以提交的只能是 Runnable 或者 Supplier,只能是静态方法;
通过静态方法生成 CompletableFuture 对象之后,便可以链式地提交其他任务了,这个时候就可以提交 Runnable、Consumer、Function 且都是成员方法。下面主要结合一下案例来分析
最简单的用法
CompletableFuture 实现了 Future 接口,所以它也具有 Future 的特 性:调用 get() 方法会阻塞在那,直到结果返回。
另外 1 个线程调用 complete 方法完成该 Future,则所有阻塞在 get() 方法的线程都将获得返回结果。
提交任务:runAsync 与 supplyAsync
例 1:runAsync(Runnable)
上面的例子是一个空的任务,下面尝试提交一个真的任务,然后等待 果返回。
例 2:supplyAsync(Supplier)
CompletableFuture.runAsync(..)传入的是一个 Runnable 接口, 在上面的代码中是使用了 Java 8 的 lambda 表达式的写法,和定义一个 Runnable 对象是等价的。
例 2 和例 1 的区别在于,例 2 的任务有返回值。没有返回值的任务, 提交的是 Runnable,返回的是 CompletableFuture;有返 回值的任务,提交的是 Supplier,返回的是 CompletableFuture;Supplier 和前面的 Callable 很相似。
通过上面两个例子可以看出,在基本的用法上,CompletableFuture 和 Future 很相似,都可以提交两类任务:一类是无返回值的,另一类是有 返回值的。
链式的 CompletableFuture:thenRun、thenAccept 和 thenApply
对于 Future,在提交任务之后,只能调用 get()等结果返回;但对 于 CompletableFuture,可以在结果上面再加一个 callback,当得到结果 之后,再接着执行 callback。
例 1:thenRun(Runnable)
例 2:thenAccept(Consumer)
例 3:thenApply(Function)
三个例子都是在任务执行完成之后,再紧急执行一个 callback,只是 callback 的形式有所区别:
thenRun 后面跟的是一个无参数、无返回值的方法,即 Runnable,所以最终的返回值是 CompletableFuture;类 型。
thenAccept 后面跟的是一个有参数、无返回值的方法,称为 Consumer,返回值也是 CompletableFuture;类型。顾名 思义,只进不出,所以称为 Consumer;前面的 Supplier,是无参数,有 返回值,只出不进,和 Consumer 刚好相反。
thenApply 后面跟的是一个有参数、有返回值的方法,称为 Function。返回值是 CompletableFuture;类型。而参数接收的是前一个任务,即 supplyAsync(..)这个任务的返回 值。因此这里只能用 supplyAsync,不能用 runAsync。因为 runAsync 没有返回值,不能为下一个链式方法传入参数。
而参数接收的是前一个任务,即 supplyAsync(..)这个任务的返回 值。因此这里只能用 supplyAsync,不能用 runAsync。因为 runAsync 没有返回值,不能为下一个链式方法传入参数。
首发地址:CompletableFuture 简单与链式的区别?
关注技术号:公众号:码农架构
深入源码,CompletableFuture 简单与链式的区别?相关推荐
- Spring AOP 源码分析 - 拦截器链的执行过程
1.简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在我们的得 ...
- Spring AOP源码解析-拦截器链的执行过程
一.简介 在前面的两篇文章中,分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在得到了 bean 的代理对象,且通知也以合适的方式插在了目标方 ...
- 一款动态跑路html源码,简单实用,上传解压就完事了
介绍: 一款动态跑路源码,简单实用,上传解压就完事了 搭建教程: 1.领取主机 2.二级域名 3.上传源码到主机文件夹,解压 4.绑定域名,搭建完成 网盘下载地址: http://kekewangLu ...
- 小程序源码:AI微信小程序源码下载人脸照片AI转换动漫照片全新源码安装简单无需服务器域名-多玩法安装简单
这是一款AI人脸转动漫的一款微信小程序源码 该款小程序源码无需服务器和域名 搭建安装简单 有多种风格转换模式可自选 安装教程: 首先解压源码然后把源码上传到微信开发者工具打开 另外设置一个合法域名 合 ...
- 小程序源码:简单舒服新UI装逼制作神器
这是一款装逼神器小程序源码 内包含了N种模板制作,另外并有大分类 另外小编还给添加了几个流量主广告,包含了每一个页面都覆盖了 而且流量主还不是单一种: Banner 激励视频 视频广告 多格子广告 横 ...
- 小程序源码:仿各大APP种树微信小程序源码下载-简单快速上手
这是一款仿各大APP的种树获取水果的一款微信小程序 可以对树浇水,杀虫,修剪等等 另外还有夺宝,更多小程序推荐 支持流量主模式等等 可以进行邀请好友加快树木的成长速度 小程序源码下载地址: 小程序源码 ...
- vue 源码自问自答-响应式原理
vue 源码自问自答-响应式原理 最近看了 Vue 源码和源码分析类的文章,感觉明白了很多,但是仔细想想却说不出个所以然. 所以打算把自己掌握的知识,试着组织成自己的语言表达出来 不打算平铺直叙的写清 ...
- 全新UI任务悬赏抢单源码-附带简单安装教程
任务悬赏系统.任务悬赏抢单系统-附带安装文档 安装说明:(具体安装说明以压缩包内为准) 服务器:Linux+Centos7.0+PHP5.6-7.0以上+宝塔 1.上传源码文件,上传数据库文件 2.修 ...
- APP种树微信小程序源码下载-简单快速上手
这是一款种树获取水果的一款微信小程序 可以对树浇水,杀虫,修剪等等 另外还有夺宝,更多小程序推荐 可以进行邀请好友加快树木的成长速度 下面是小编的演示图: 小程序源码下载地址:(已更新)APP种树微信 ...
最新文章
- 发现了阿里云 APP 的一个小 BUG
- 【看完请推荐】记国庆前的一次码农受骗记
- 凸优化 [Convex Optimization] — [美] 鲍德(Stephen Boyd),Lieven Vandenberghe 著,王书宁,许鋆,黄晓霖 译
- Jmeter接口测试-断言
- 我的2012年度总结
- 3分钟学会python_3分钟学会一个Python小技巧
- asp.net core mvc接口,请求响应统一日志管理
- (转)学习directx遇到的问题
- 层净高怎么算_层高和净高怎么算,标准是多少?
- 大白话vue——slot的作用与使用
- PHP 简单的页面跳转提示
- hud android,Android 加载等待控件 ZFProgressHUD
- html修改鼠标手势,css要怎么设置鼠标手势?
- NVI(Non-Virtual Interface )
- 伯禹公益AI《动手学深度学习PyTorch版》Task 07 学习笔记
- Android 设置APP桌面图标
- OVER(PARTITION BY)函数介绍(oracle数据库)
- excel之工作表工作簿保护暴力撤销
- 游戏版号停发和疫情反复的这半年,UWA如何躬身入局?
- 实木工程转计算机专业方法,现代实木椅的设计方法及计算机辅助设计探析
热门文章
- PowerManagerService分析(二)之updatePowerStateLocked()核心
- 如何UNI-APP中使用iconfont彩色图标
- linux自动清理磁盘日志的一种方案
- Y7000P电池0%解决办法
- 预告|2022 星策 Summit 企业数智化转型论坛议程公布!
- 【Linux-scp】scp命令
- 系统配置microsoft服务器,Windows 评估服务设置和配置
- 【三】仿射变换、投影变换的矩阵形式和特点归纳
- python输出语句print格式_print输出语句的格式是什么?
- easyexcel解析zip包加密excel文件