当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2022-07-05
出自: 腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执

出自:

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

概述

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

  • 调用校验服务校验待生成的订单是否合法
  • 订单服务生成订单(校验服务和订单服务没有依赖关系)
  • 调用1和2,支付服务实现支付核心的功能
  • 结合步骤1至3完成支付服务的聚合调用
  • 假如步骤1的耗时5秒,步骤2的耗时3秒,步骤3的耗时2秒,如果你是架构师,要求:

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

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

    Future类图

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

    Future的不足

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

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

  • 将两个异步计算合并为一个(第二个异步计算依赖于第一个的结果),这个用Future不太好实现.
  • 等待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;
    }

    }


    网友评论