0
点赞
收藏
分享

微信扫一扫

Java多线程异步调用性能调优

出自:

腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执行结果也整理了一下, 做了个笔记

概述

大型电商公司的支付聚合服务都有这类的场景:

  1. 调用校验服务校验待生成的订单是否合法
  2. 订单服务生成订单(校验服务和订单服务没有依赖关系)
  3. 调用1和2,支付服务实现支付核心的功能
  4. 结合步骤1至3完成支付服务的聚合调用

假如步骤1的耗时5秒,步骤2的耗时3秒,步骤3的耗时2秒,如果你是架构师,要求:

  1. 请实现微服务的同步调用
  2. 请实现微服务的异步调用(使用CompletableFuture实现)
    比较1和2的性能.

同步调用和异步调用

Java多线程异步调用性能调优_spring

Future类图

Java多线程异步调用性能调优_spring boot_02

Future的不足

Java多线程异步调用性能调优_异步调用_03

Future直接表述多个Future结果之间的依赖性,有一定的缺陷:

  1. 将两个异步计算合并为一个(第二个异步计算依赖于第一个的结果),这个用Future不太好实现.
  2. 等待Future集合中的所有的任务都完成
    仅等待Future集合中最快结束的任务完成,并返回它的结果

代码

代码地址

​​https://gitee.com/zjj19941/mutil-thread/tree/master/src/main/java/com/yrxy/thread/case14​​ ​

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;
}

}


举报

相关推荐

0 条评论