接口调用是什么意思?常用的接口调用方式分享
502
2022-08-23
Java多线程异步调用性能调优方法详解
目录概述同步调用和异步调用Future类图Future的不足代码代码地址TestPaymentServiceCheckServiceOrderService总结
概述
大型电商公司的支付聚合服务都有这类的场景:
调用校验服务校验待生成的订单是否合法订单服务生成订单(校验服务和订单服务没有依赖关系)调用1和2,支付服务实现支付核心的功能结合步骤1至3完成支付服务的聚合调用
假如步骤1的耗时5秒,步骤2的耗时3秒,步骤3的耗时2秒,如果你是架构师,要求:
1.请实现微服务的同步调用
2.请实现微服务的异步调用(使用CompletableFuture实现)
比较1和2的性能.
同步调用和异步调用
Future类图
Future的不足
Future直接表述多个Future结果之间的依赖性,有一定的缺陷:
1.将两个异步计算合并为一个(第二个异步计算依赖于第一个的结果),这个用Future不太好实现.
2.等待Future集合中的所有的任务都完成
仅等待Future集合中最快结束的任务完成,并返回它的结果
代码
代码地址
https://gitee.com/zjvngvn/mutil-thread
Test
public class Test {
public static void main(String[] args) {
// 同步调用
long start1 = System.currentTimeMillis();
PaymentService.syncPay();
System.out.println("同步支付耗时:" + (System.currentTimeMillis() - start1)+" ms");
System.out.println("=========================");
// 异步调用
long start2 = System.currentTimeMillis();
PaymentService.asyncPay();
System.out.println("异步支付耗时:" + (System.currentTimeMillis() - start2)+" ms");
}
}
PaymentService
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class PaymentService {
/**
* 异步支付的入口方法
*
* @return
*/
public static boolean asyncPay() {
//校验
CompletableFuture
//创建订单
CompletableFuture
//支付
CompletableFuture
// 上面三个都完成之后,再进行下面匿名内部类的代码
CompletableFuture.allOf(isValid, orderSum, money)
.thenRun(() -> System.out.println("完成异步支付"))
.join();
return true;
}
/**
* 同步支付的入口方法
*
* @return
*/
public static boolean syncPay() {
CheckService.isValid();
OrderService.createOrder();
basePay();
System.out.println("同步支付成功");
//假设支付成功
return true;
}
public static int basePay() {
int money = 1000;
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("支付");
//假设支付成功
return money;
}
}
CheckService
import java.util.concurrent.TimeUnit;
public class CheckService {
/**
* 返回true说明订单流程才会往下走
*/
public static boolean isValid() {
System.out.println("订单生成前,检验订单是否合法" );
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.priHLYbOMtZgntStackTrace();
}
//假设订单合法,通过校验
return true;
}
}
OrderService
import java.util.concurrent.TimeUnit;
public class OrderService {
public static int createOrder() {
int orderSum=1;
System.out.println("生成订单" );
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
//假设订单数量为1
return orderSum;
}
}
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~