CompletableFuture的由来

CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利。

代码示例(一)

thenCombine(合并)

public class Futrue {public static void main(String[] args) {System.out.println("小范来到了餐厅");System.out.println("小范点了 番茄炒蛋+ 一碗米饭");CompletableFuture<String> data = CompletableFuture.supplyAsync(() -> {System.out.println("厨师开始炒菜");work(5);return "番茄炒蛋";}).thenCombine(CompletableFuture.supplyAsync(() -> {System.out.println("服务员开始蒸米饭");work(2);return "米饭";}), (food1, food2) -> {return food1 + food1;});System.out.println("小范先打一把游戏等饭做好");System.out.println(data.join()+"饭做好了。小范开始吃饭");System.out.println("我吃完饭了");}//开始工作 workTime:工作时间public static void work(Integer workTime) {try {TimeUnit.SECONDS.sleep(workTime);} catch (InterruptedException e) {e.printStackTrace();}}
}

小范来到了餐厅
小范点了 番茄炒蛋+ 一碗米饭
厨师开始炒菜
服务员开始蒸米饭
小范先打一把游戏等饭做好
服务员蒸完米饭
厨师炒完菜了
番茄炒蛋番茄炒蛋饭做好了。小范开始吃饭
我吃完饭了

这里我们发现厨师炒菜和服务员蒸米饭是同时进行的,最后并把两个线程的结果合并并返回

代码示例(二)

thenCompose(连接)

public class Futrue {public static void main(String[] args) {System.out.println("小范来到了餐厅");System.out.println("小范点了 番茄炒蛋+ 一碗米饭");CompletableFuture<String> data = CompletableFuture.supplyAsync(() -> {System.out.println("厨师开始炒菜");work(5);System.out.println("厨师炒菜完成");return "番茄炒蛋";}).thenCompose(dish -> CompletableFuture.supplyAsync(() -> {System.out.println("服务员开始打菜");work(2);System.out.println("服务员打菜完成");return dish + "米饭";}));System.out.println("小范先打一把游戏等饭做好");System.out.println(data.join()+"饭做好了。小范开始吃饭");System.out.println("我吃完饭了");}//开始工作 workTime:工作时间public static void work(Integer workTime) {try {TimeUnit.SECONDS.sleep(workTime);} catch (InterruptedException e) {e.printStackTrace();}}
}

小范来到了餐厅
小范点了 番茄炒蛋+ 一碗米饭
厨师开始炒菜
小范先打一把游戏等饭做好
厨师炒菜完成
服务员开始打菜
服务员打菜完成
番茄炒蛋米饭饭做好了。小范开始吃饭
我吃完饭了

这里我们会发先厨师炒菜和服务员蒸米饭是顺序执行的,最后由服务员把菜和饭端给客人

代码示例(三)

thenApply 和thenCompose很相像

public class Futrue {public static void main(String[] args) {System.out.println("小范吃完饭了");System.out.println("小范结账,要求开发票");//场景:要求收款的和发票的是同一个人CompletableFuture<String> data = CompletableFuture.supplyAsync(() -> {System.out.println("服务员" + Thread.currentThread().getName() + "收款500");work(5);System.out.println("服务员" + Thread.currentThread().getName() + "收完款");return "500";}).thenApply(money -> {System.out.println("开票员" + Thread.currentThread().getName() + "开了"+money+"大小的发票");work(5);System.out.println("开票员" + Thread.currentThread().getName() + "开完了票");return "500元发票";});System.out.println("小范接了电话准备回家玩游戏");System.out.println(data.join() + "开好了。");System.out.println("小范回家");}//开始工作 workTime:工作时间public static void work(Integer workTime) {try {TimeUnit.SECONDS.sleep(workTime);} catch (InterruptedException e) {e.printStackTrace();}}
}

小范吃完饭了
小范结账,要求开发票
服务员ForkJoinPool.commonPool-worker-9收款500
小范接了电话准备回家玩游戏
服务员ForkJoinPool.commonPool-worker-9收完款
开票员ForkJoinPool.commonPool-worker-9开了500大小的发票
开票员ForkJoinPool.commonPool-worker-9开完了票
500元发票开好了。
小范准备回家

代码示例(四)

applyToEither :获取执行速度最快的异步方法并返回结果

public class Futrue {public static void main(String[] args) {System.out.println("小范走出食堂,来到公交站");System.out.println("等待1路汽车 或者 2路汽车");CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {System.out.println("1路汽车正在赶来");work(5);return "1路汽车";}).applyToEither(CompletableFuture.supplyAsync(() -> {System.out.println("2路汽车正在赶来");work(10);return "2路汽车";}), fisrtMethod -> fisrtMethod);System.out.println(completableFuture.join()+"汽车先来,坐上回家");}//开始工作 workTime:工作时间public static void work(Integer workTime) {try {TimeUnit.SECONDS.sleep(workTime);} catch (InterruptedException e) {e.printStackTrace();}}
}

小范走出食堂,来到公交站
等待1路汽车 或者 2路汽车
1路汽车正在赶来
2路汽车正在赶来
1路汽车汽车先来,坐上回家

示例代码(五)

exceptionally:异步编程异常处理

public class Futrue {public static void main(String[] args) {System.out.println("小范走出食堂,来到公交站");System.out.println("等待1路汽车 或者 2路汽车");CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {System.out.println("1路汽车正在赶来");work(5);return "1路汽车";}).applyToEither(CompletableFuture.supplyAsync(() -> {System.out.println("2路汽车正在赶来");work(10);return "2路汽车";}), fisrtMethod -> {if (fisrtMethod.equals("1路汽车")) {throw new RuntimeException("撞树了");}return fisrtMethod;}).exceptionally(e -> {System.out.println(e.getMessage());System.out.println("小白叫了出租车回家");return "出租车";});System.out.println(completableFuture.join() + "汽车先来,坐上回家");}//开始工作 workTime:工作时间public static void work(Integer workTime) {try {TimeUnit.SECONDS.sleep(workTime);} catch (InterruptedException e) {e.printStackTrace();}}
}

小范走出食堂,来到公交站
等待1路汽车 或者 2路汽车
1路汽车正在赶来
2路汽车正在赶来
java.lang.RuntimeException: 撞树了
小白叫了出租车回家
出租车汽车先来,坐上回家

CompletableFuture(异步编程)相关推荐

  1. java 并发 异步_Java并发 CompletableFuture异步编程的实现

    前面我们不止一次提到,用多线程优化性能,其实不过就是将串行操作变成并行操作.如果仔细观察,你还会发现在串行转换成并行的过程中,一定会涉及到异步化,例如下面的示例代码,现在是串行的,为了提升性能,我们得 ...

  2. JUC系列(十一) | Java 8 CompletableFuture 异步编程

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  3. CompletableFuture 异步编程

    本文从实例出发,介绍 CompletableFuture 基本用法.不过讲的再多,不如亲自上手练习一下.所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture. 全文摘要: ...

  4. java8异步任务,Java8 - CompletableFuture 异步编程类

    其他异步编程方法 Java5中新增了Future接口,用来描述异步计算的结果.虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得 ...

  5. java8 CompletableFuture异步编程

    Future 接口的局限性 Future接口可以构建异步应用,但依然有其局限性.它很难直接表述多个Future 结果之间的依赖性.实际开发中,我们经常需要达成以下目的: 将两个异步计算合并为一个--这 ...

  6. completable java_java8 CompletableFuture异步编程

    Future 接口的局限性 Future接口可以构建异步应用,但依然有其局限性.它很难直接表述多个Future 结果之间的依赖性.实际开发中,我们经常需要达成以下目的: 将两个异步计算合并为一个--这 ...

  7. 【Java并发编程实战】(十七):Future和CompletableFuture的原理及实战——异步编程没有那么难

    文章目录 引言 生活中的例子 场景1 场景2 Java中的Future 如何获取Future Future的主要方法及使用 Future的核心源码 Future模式的高阶版本-- Completabl ...

  8. Java 8 的异步编程利器 CompletableFuture 真香!

    大家好,我是不才陈某~ 最近刚好使用CompeletableFuture优化了项目中的代码,所以跟大家一起学习CompletableFuture. 一个例子回顾 Future 因为Completabl ...

  9. 【异步编程学习笔记】JDK中的FutureTask和CompletableFuture详解(使用示例、源码)

    文章目录 FutureTask概述 使用实例 类图结构 FutureTask的run()方法 FutureTask的局限性 CompletableFuture概述 CompletableFuture代 ...

  10. Java8新的异步编程方式 CompletableFuture(三)

    前面两篇文章已经整理了CompletableFuture大部分的特性,本文会整理完CompletableFuture余下的特性,以及将它跟RxJava进行比较. 3.6 Either Either 表 ...

最新文章

  1. 顺序表-顺序表的基本操作(插入元素+删除元素)
  2. 人工智能模型数据泄露的攻击与防御研究综述
  3. netty依赖_高性能:《一遍文章带你看懂 Netty世界》
  4. hey 安装_如何在助理扬声器上调整“ Hey Google”的灵敏度
  5. C++四种强制类型转换
  6. 我的心无法平静python好学吗
  7. 设计抗100亿请求的春晚红包系统
  8. 奈飞文化手册_奈飞文化手册,如何塑造企业文化
  9. android httppost
  10. C#获取实体的属性和值(通用于BS、cs架构)
  11. 作为一个新人,怎样学习嵌入式Linux?(转自韦东山)
  12. OceanBase部署observer启动后log日志狂写问题
  13. ipad查看电脑中的文件
  14. Python实现网页自动化-浏览器查找元素(二)
  15. 钢笔工具使用目前的最高水平
  16. 【C#】数字图像识别
  17. Windows和Linux上的管道符
  18. 英文版sketch如何转为中文版?sketch英文转为中文教程!
  19. 如何利用基于PXI的下一代ATE系统测试平台进行军事/航天/卫星电子设备测试
  20. 复杂指令集(CISC)和精简指令集(RISC)

热门文章

  1. Android studio安装配置
  2. 直流无刷电机霍尔传感器2种安装方式
  3. Adminlte的使用理解
  4. 没戏,做不到,不存在的“不可能三角”
  5. 近期用户/金蝶等ERP系统 MS SQL Server 数据库故障 典型恢复案例
  6. windows修复命令
  7. python写股票指标_用Python做股票指标RSI分析
  8. Android 网络编程之HTTPS详解
  9. Oracle 11g 新特性 -- RMAN Data Recovery Advisor(DRA) 说明
  10. 哲学博士创立,创投教父投资,这家公司要冲击美股最大IPO了