CompletableFuture(异步编程)
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(异步编程)相关推荐
- java 并发 异步_Java并发 CompletableFuture异步编程的实现
前面我们不止一次提到,用多线程优化性能,其实不过就是将串行操作变成并行操作.如果仔细观察,你还会发现在串行转换成并行的过程中,一定会涉及到异步化,例如下面的示例代码,现在是串行的,为了提升性能,我们得 ...
- JUC系列(十一) | Java 8 CompletableFuture 异步编程
多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...
- CompletableFuture 异步编程
本文从实例出发,介绍 CompletableFuture 基本用法.不过讲的再多,不如亲自上手练习一下.所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture. 全文摘要: ...
- java8异步任务,Java8 - CompletableFuture 异步编程类
其他异步编程方法 Java5中新增了Future接口,用来描述异步计算的结果.虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得 ...
- java8 CompletableFuture异步编程
Future 接口的局限性 Future接口可以构建异步应用,但依然有其局限性.它很难直接表述多个Future 结果之间的依赖性.实际开发中,我们经常需要达成以下目的: 将两个异步计算合并为一个--这 ...
- completable java_java8 CompletableFuture异步编程
Future 接口的局限性 Future接口可以构建异步应用,但依然有其局限性.它很难直接表述多个Future 结果之间的依赖性.实际开发中,我们经常需要达成以下目的: 将两个异步计算合并为一个--这 ...
- 【Java并发编程实战】(十七):Future和CompletableFuture的原理及实战——异步编程没有那么难
文章目录 引言 生活中的例子 场景1 场景2 Java中的Future 如何获取Future Future的主要方法及使用 Future的核心源码 Future模式的高阶版本-- Completabl ...
- Java 8 的异步编程利器 CompletableFuture 真香!
大家好,我是不才陈某~ 最近刚好使用CompeletableFuture优化了项目中的代码,所以跟大家一起学习CompletableFuture. 一个例子回顾 Future 因为Completabl ...
- 【异步编程学习笔记】JDK中的FutureTask和CompletableFuture详解(使用示例、源码)
文章目录 FutureTask概述 使用实例 类图结构 FutureTask的run()方法 FutureTask的局限性 CompletableFuture概述 CompletableFuture代 ...
- Java8新的异步编程方式 CompletableFuture(三)
前面两篇文章已经整理了CompletableFuture大部分的特性,本文会整理完CompletableFuture余下的特性,以及将它跟RxJava进行比较. 3.6 Either Either 表 ...
最新文章
- 顺序表-顺序表的基本操作(插入元素+删除元素)
- 人工智能模型数据泄露的攻击与防御研究综述
- netty依赖_高性能:《一遍文章带你看懂 Netty世界》
- hey 安装_如何在助理扬声器上调整“ Hey Google”的灵敏度
- C++四种强制类型转换
- 我的心无法平静python好学吗
- 设计抗100亿请求的春晚红包系统
- 奈飞文化手册_奈飞文化手册,如何塑造企业文化
- android httppost
- C#获取实体的属性和值(通用于BS、cs架构)
- 作为一个新人,怎样学习嵌入式Linux?(转自韦东山)
- OceanBase部署observer启动后log日志狂写问题
- ipad查看电脑中的文件
- Python实现网页自动化-浏览器查找元素(二)
- 钢笔工具使用目前的最高水平
- 【C#】数字图像识别
- Windows和Linux上的管道符
- 英文版sketch如何转为中文版?sketch英文转为中文教程!
- 如何利用基于PXI的下一代ATE系统测试平台进行军事/航天/卫星电子设备测试
- 复杂指令集(CISC)和精简指令集(RISC)