Java多线程异步调用性能调优方法详解

网友投稿 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 isValid = CompletableFuture.supplyAsync(() -> CheckService.isValid());

//创建订单

CompletableFuture orderSum = CompletableFuture.supplyAsync(() -> OrderService.createOrder());

//支付

CompletableFuture money = CompletableFuture.supplyAsync(() -> basePay());

// 上面三个都完成之后,再进行下面匿名内部类的代码

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小时内删除侵权内容。

上一篇:【整理】最常见的10道Python面试题及答案!(python面试题选择题)
下一篇:都2022年了,Python Web框架你不会只知道Django和Flask吧?(都2022年了,还有人不知道蚝油要放冰箱?)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~