导读:从 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 简单与链式的区别?相关推荐

  1. Spring AOP 源码分析 - 拦截器链的执行过程

    1.简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在我们的得 ...

  2. Spring AOP源码解析-拦截器链的执行过程

    一.简介 在前面的两篇文章中,分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在得到了 bean 的代理对象,且通知也以合适的方式插在了目标方 ...

  3. 一款动态跑路html源码,简单实用,上传解压就完事了

    介绍: 一款动态跑路源码,简单实用,上传解压就完事了 搭建教程: 1.领取主机 2.二级域名 3.上传源码到主机文件夹,解压 4.绑定域名,搭建完成 网盘下载地址: http://kekewangLu ...

  4. 小程序源码:AI微信小程序源码下载人脸照片AI转换动漫照片全新源码安装简单无需服务器域名-多玩法安装简单

    这是一款AI人脸转动漫的一款微信小程序源码 该款小程序源码无需服务器和域名 搭建安装简单 有多种风格转换模式可自选 安装教程: 首先解压源码然后把源码上传到微信开发者工具打开 另外设置一个合法域名 合 ...

  5. 小程序源码:简单舒服新UI装逼制作神器

    这是一款装逼神器小程序源码 内包含了N种模板制作,另外并有大分类 另外小编还给添加了几个流量主广告,包含了每一个页面都覆盖了 而且流量主还不是单一种: Banner 激励视频 视频广告 多格子广告 横 ...

  6. 小程序源码:仿各大APP种树微信小程序源码下载-简单快速上手

    这是一款仿各大APP的种树获取水果的一款微信小程序 可以对树浇水,杀虫,修剪等等 另外还有夺宝,更多小程序推荐 支持流量主模式等等 可以进行邀请好友加快树木的成长速度 小程序源码下载地址: 小程序源码 ...

  7. vue 源码自问自答-响应式原理

    vue 源码自问自答-响应式原理 最近看了 Vue 源码和源码分析类的文章,感觉明白了很多,但是仔细想想却说不出个所以然. 所以打算把自己掌握的知识,试着组织成自己的语言表达出来 不打算平铺直叙的写清 ...

  8. 全新UI任务悬赏抢单源码-附带简单安装教程

    任务悬赏系统.任务悬赏抢单系统-附带安装文档 安装说明:(具体安装说明以压缩包内为准) 服务器:Linux+Centos7.0+PHP5.6-7.0以上+宝塔 1.上传源码文件,上传数据库文件 2.修 ...

  9. APP种树微信小程序源码下载-简单快速上手

    这是一款种树获取水果的一款微信小程序 可以对树浇水,杀虫,修剪等等 另外还有夺宝,更多小程序推荐 可以进行邀请好友加快树木的成长速度 下面是小编的演示图: 小程序源码下载地址:(已更新)APP种树微信 ...

最新文章

  1. 发现了阿里云 APP 的一个小 BUG
  2. 【看完请推荐】记国庆前的一次码农受骗记
  3. 凸优化 [Convex Optimization] — [美] 鲍德(Stephen Boyd),Lieven Vandenberghe 著,王书宁,许鋆,黄晓霖 译
  4. Jmeter接口测试-断言
  5. 我的2012年度总结
  6. 3分钟学会python_3分钟学会一个Python小技巧
  7. asp.net core mvc接口,请求响应统一日志管理
  8. (转)学习directx遇到的问题
  9. 层净高怎么算_层高和净高怎么算,标准是多少?
  10. 大白话vue——slot的作用与使用
  11. PHP 简单的页面跳转提示
  12. hud android,Android 加载等待控件 ZFProgressHUD
  13. html修改鼠标手势,css要怎么设置鼠标手势?
  14. NVI(Non-Virtual Interface )
  15. 伯禹公益AI《动手学深度学习PyTorch版》Task 07 学习笔记
  16. Android 设置APP桌面图标
  17. OVER(PARTITION BY)函数介绍(oracle数据库)
  18. excel之工作表工作簿保护暴力撤销
  19. 游戏版号停发和疫情反复的这半年,UWA如何躬身入局?
  20. 实木工程转计算机专业方法,现代实木椅的设计方法及计算机辅助设计探析

热门文章

  1. PowerManagerService分析(二)之updatePowerStateLocked()核心
  2. 如何UNI-APP中使用iconfont彩色图标
  3. linux自动清理磁盘日志的一种方案
  4. Y7000P电池0%解决办法
  5. 预告|2022 星策 Summit 企业数智化转型论坛议程公布!
  6. 【Linux-scp】scp命令
  7. 系统配置microsoft服务器,Windows 评估服务设置和配置
  8. 【三】仿射变换、投影变换的矩阵形式和特点归纳
  9. python输出语句print格式_print输出语句的格式是什么?
  10. easyexcel解析zip包加密excel文件