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

 更新时间:2022年3月7日 16:52  点击:554 作者:张俊杰1994

概述

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

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

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

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

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

比较1和2的性能.​

同步调用和异步调用

image.png

Future类图

image.png

Future的不足

image.png

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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容!  

原文出处:https://blog.csdn.net/qq_41489540/article/details/123315325

[!--infotagslink--]

相关文章