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

 更新时间:2022年03月07日 11:49:29   作者:张俊杰1994  
这篇文章主要为大家详细介绍了Java多线程异步调用性能调优,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

概述

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

  • 调用校验服务校验待生成的订单是否合法
  • 订单服务生成订单(校验服务和订单服务没有依赖关系)
  • 调用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;
    }
}

总结

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

相关文章

  • 一文教你学会搭建SpringBoot分布式项目

    一文教你学会搭建SpringBoot分布式项目

    这篇文章主要为大家详细介绍了搭建SpringBoot分布式项目的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Spring mvc整合mybatis(crud+分页插件)操作mysql

    Spring mvc整合mybatis(crud+分页插件)操作mysql

    这篇文章主要介绍了Spring mvc整合mybatis(crud+分页插件)操作mysql的步骤详解,需要的朋友可以参考下
    2017-04-04
  • Java反射机制的适用场景及利弊详解

    Java反射机制的适用场景及利弊详解

    这篇文章主要介绍了Java反射机制的适用场景及利弊详解,Spring用到很多反射机制,在xml文件或者properties里面写好了配置,然后在Java类里面解析xml或properties里面的内容,得到一个字符串,然后用反射机制,需要的朋友可以参考下
    2023-08-08
  • 深入解读Java代码组织中的package包结构

    深入解读Java代码组织中的package包结构

    这篇文章主要介绍了Java代码组织中的package包结构,是Java入门学习中的基础知识,需要的朋友可以参考下
    2016-03-03
  • Java-Java5.0注解全面解读

    Java-Java5.0注解全面解读

    这篇文章主要介绍了Java-Java5.0注解全面解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java实现基于TCP协议网络socket编程(C/S通信)

    java实现基于TCP协议网络socket编程(C/S通信)

    这篇文章主要介绍了java实现基于TCP协议网络socket编程(C/S通信),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 使用Java发送带附件的附件的示例

    使用Java发送带附件的附件的示例

    这篇文章主要介绍了使用Java发送带附件的附件的方法,使用到了JavaMail这个API,需要的朋友可以参考下
    2015-11-11
  • Java static方法用法实战案例总结

    Java static方法用法实战案例总结

    这篇文章主要介绍了Java static方法用法,结合具体案例形式总结分析了java static方法功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • java中对象为null时的打印输出方式

    java中对象为null时的打印输出方式

    这篇文章主要介绍了java中对象为null时的打印输出方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot如何接收数组参数的方法

    SpringBoot如何接收数组参数的方法

    这篇文章主要介绍了SpringBoot如何接收数组参数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论