使用 CompeletedFuture 实现异步调用
在我们平时写的项目中,异步调用是一个比较重要的优化手段,在 Java 中,提供了 CompletedFuture 供我们使用,具体实现如下:
例子
假如现在有一个需求,我需要去淘宝、天猫和京东去搜索某样商品的价格,哪个平台价格低我就去哪个平台购买。
代码
现在我模拟了三个方法:分别是去淘宝、天猫和京东去搜索价格
private static double priceOfTb() {
delay();
return new Random().nextDouble() * 100 ;
}
private static double priceOfTm() {
delay();
return new Random().nextDouble() * 100;
}
private static double priceOfJd() {
delay();
return new Random().nextDouble() * 100;
}
delay 方法是模拟是搜索价格耗时:
private static void delay() {
int time = new Random().nextInt(5);
SleepHelper.sleep(time);
System.out.printf("search cost %s seconds\n", time);
}
如果使用同步的方法,耗时如下:
public static void main(String[] args) throws ExecutionException, InterruptedException, IOException {
long start;
start = System.currentTimeMillis();
double tb = priceOfTb();
double tm = priceOfTm();
double jd = priceOfJd();
System.out.println("淘宝价格:" + tb);
System.out.println("天猫价格:" + tm);
System.out.println("京东价格:" + jd);
System.out.println("cost time " + (System.currentTimeMillis() - start)/1000 + "秒");
}

耗时是 3+3+2 一共耗时 8 秒
如果使用异步的方法,耗时如下:
public static void main(String[] args) throws ExecutionException, InterruptedException, IOException {
long start;
start = System.currentTimeMillis();
CompletableFuture<Double> tb = CompletableFuture.supplyAsync(CompletedFutureTest::priceOfTb);
CompletableFuture<Double> tm = CompletableFuture.supplyAsync(CompletedFutureTest::priceOfTm);
CompletableFuture<Double> jd = CompletableFuture.supplyAsync(CompletedFutureTest::priceOfJd);
// join 方法是等待 tb,tm,jd 都执行完了才继续往下执行
CompletableFuture.allOf(tb, tm, jd).join();
System.out.println("淘宝价格:" + tb.get());
System.out.println("天猫价格:" + tm.get());
System.out.println("京东价格:" + jd.get());
System.out.println("cost time " + (System.currentTimeMillis() - start)/1000 + "秒");
}

一共花费了 3 秒
使用 CompeletedFuture 实现异步调用的更多相关文章
- C#委托异步调用
参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...
- Direct3D Draw函数 异步调用原理解析
概述 在D3D10中,一个基本的渲染流程可分为以下步骤: 清理帧缓存: 执行若干次的绘制: 通过Device API创建所需Buffer: 通过Map/Unmap填充数据到Buffer中: 将Buff ...
- 一个简单的webservice的demo(下)winform异步调用webservice
绕了一大圈,又开始接触winform的项目来了,虽然很小吧.写一个winform的异步调用webservice的demo,还是简单的. 一个简单的Webservice的demo,简单模拟服务 一个简单 ...
- 浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法(转载)
在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:t ...
- tornado 异步调用系统命令和非阻塞线程池
项目中异步调用 ping 和 nmap 实现对目标 ip 和所在网关的探测 Subprocess.STREAM 不用担心进程返回数据过大造成的死锁, Subprocess.PIPE 会有这个问题. i ...
- .Net组件程序设计之异步调用
.Net组件程序设计之异步调用 说到异步调用,在脑海中首先想到就是BeginInvoke(),在一些常用对象中我们也会常常见到Invoke()和BeginInvoke(), 要想让自己的组件可以被客户 ...
- 谈谈RPC中的异步调用设计
RPC(远过程调用)在分布式系统中是很常用的基础通讯手段,核心思想是将不同进程之间的通讯抽象为函数调用,基本的过程是调用端通过将参数序列化到流中并发送给服务端,服务端从流中反序列化出参数并完成实际的处 ...
- (转)spring boot注解 --@EnableAsync 异步调用
原文:http://www.cnblogs.com/azhqiang/p/5609615.html EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. @Co ...
- C# 多线程详解 Part.02(UI 线程和子线程的互动、ProgressBar 的异步调用)
我们先来看一段运行时会抛出 InvalidOperationException 异常的代码段: private void btnThreadA_Click(object sender, ...
- ajaxpro 异步调用
AjaxPro一般默认是同步调用,异步调用只需要在方法后面加一个callback函数,直接取value属性即可.例如: MyNameSpace.Page1.getOtherConfig("A ...
随机推荐
- WPS HW 漏洞 学习
复现过程 2023 年 HW 出现 WPS 0day POC 影响版本: WPS Office 2023个人版<11.1.0.15120 WPS Office 2019企业版<11.8.2 ...
- Spring Cloud Sleuth:分布式请求链路跟踪
Spring Cloud Sleuth:分布式请求链路跟踪 SpringCloud学习教程 SpringCloud Spring Cloud Sleuth 是分布式系统中跟踪服务间调用的工具,它可以直 ...
- 润乾报表如何从 mongodb 中取数
MongoDB 属于 NoSql 中的基于分布式文件存储的文档型数据库,是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较 ...
- MAC上Cisco AnyConnect删除不干净,造成无法重新安装的解决办法
1.问题 由于直接删除而不是正常卸载,导致文件残留,无法正常安装,并且软件不可用 2.解决 2.1 终端运行命令 pkgutil --pkgs|grep com.cisco 查看cisco残留的文件 ...
- 力扣476(java)-数字的补数(简单)
题目: 对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数. 例如,整数 5 的二进制表示是 "101" ,取反后得到 "0 ...
- HarmonyOS NEXT应用开发案例—自定义日历选择器
介绍 本示例介绍通过CustomDialogController类显示自定义日历选择器. 效果图预览 使用说明 加载完成后显示主界面,点当前日期后会弹出日历选择器,选择日期后会关闭弹窗,主页面日期会变 ...
- OSCAR 2022 开源产业大会PolarDB-X、 PolarDB-PG获奖揭晓
简介: 作为全球数据库领导者,阿里云数据库坚定拥抱开源.此次亮相大会,旗下核心开源项目云原生分布式数据库PolarDB-X通过了信通院的 "可信开源项目评估,并以正式成员身份,加入中国信通院 ...
- 专访香侬科技:致力于让世界听到中文NLP的声音
像所有的创业者一样,香侬科技的初创团队胸怀梦想,期待有一天当人们提起香侬的时候,除了"信息论之父",还能想起来有一家用技术在链接大千世界的科技公司--香侬科技. 新生的香侬科技选 ...
- 作业帮基于 DeltaLake 的数据湖建设最佳实践
简介:作业帮是一家以科技为载体的在线教育公司,其大数据中台作为基础系统中台,主要负责建设公司级数仓,向各个产品线提供面向业务主题的数据信息.本文主要分享了作业帮基于 DeltaLake 的数据湖建设 ...
- CPU Burst有副作用吗?让数学来回答!| 龙蜥技术
简介: 使用CPU Burst的副作用是什么?是否有不适用的场景呢?戳我给你答案~ 编者按:CPU Burst 特性已合入 Linux 5.14,Anolis OS 8.2.Alibaba Clou ...