验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

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

阅读:900 来源:乙速云 作者:代码code

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

      概述

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

      • 调用校验服务校验待生成的订单是否合法

      • 订单服务生成订单(校验服务和订单服务没有依赖关系)

      • 调用1和2,支付服务实现支付核心的功能

      • 结合步骤1至3完成支付服务的聚合调用

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

      1.请实现微服务的同步调用

      2.请实现微服务的异步调用(使用CompletableFuture实现)

      比较1和2的性能.

      同步调用和异步调用

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

      Future类图

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

      Future的不足

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

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

      1.将两个异步计算合并为一个(第二个异步计算依赖于第一个的结果),这个用Future不太好实现.

      2.等待Future集合中的所有的任务都完成

      仅等待Future集合中最快结束的任务完成,并返回它的结果

      代码

      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.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;
          }
      }
    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>