Java多线程异步调用性能调优方法详解
作者:张俊杰1994
这篇文章主要为大家详细介绍了Java多线程异步调用性能调优,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
概述
大型电商公司的支付聚合服务都有这类的场景:
- 调用校验服务校验待生成的订单是否合法
- 订单服务生成订单(校验服务和订单服务没有依赖关系)
- 调用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<Boolean> isValid = CompletableFuture.supplyAsync(() -> CheckService.isValid()); //创建订单 CompletableFuture<Integer> orderSum = CompletableFuture.supplyAsync(() -> OrderService.createOrder()); //支付 CompletableFuture<Integer> 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.printStackTrace(); } //假设订单合法,通过校验 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; } }
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!