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

总结

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

相关文章

  • 详解Java文件下载的几种实现方式

    详解Java文件下载的几种实现方式

    这篇文章主要介绍了详解Java文件下载的几种实现方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • SpringBoot中Aware接口使用及原理解析

    SpringBoot中Aware接口使用及原理解析

    在Spring中存在一个Aware接口,实现该接口可以让我们的Bean获取到Spring容器中特定的资源,但该接口只是个标记接口,不存在任何方法,本文将给大家详细介绍一下SpringBoot中Aware接口使用及原理,需要的朋友可以参考下
    2023-08-08
  • Mybatis-Plus实现自动生成代码的操作步骤

    Mybatis-Plus实现自动生成代码的操作步骤

    AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率,本文将给大家介绍Mybatis-Plus实现自动生成代码的操作步骤
    2023-10-10
  • java使用xpath解析xml示例分享

    java使用xpath解析xml示例分享

    XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力,下面是一小示例,需要的朋友可以参考下
    2014-03-03
  • JVM 方法调用之静态分派(详解)

    JVM 方法调用之静态分派(详解)

    下面小编就为大家带来一篇JVM 方法调用之静态分派(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java中上传图片压缩处理的方法示例

    Java中上传图片压缩处理的方法示例

    本篇文章主要介绍了Java中图片压缩处理的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Spring注解开发生命周期原理解析

    Spring注解开发生命周期原理解析

    这篇文章主要介绍了Spring注解开发生命周期原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java 在生活中的 10 大应用

    Java 在生活中的 10 大应用

    这篇文章主要给大家分享Java 在生活中的 10 大应用,桌面图形用户界面、移动应用、人工智能、网络应用程序、大数据技术、游戏应用、商业应用、嵌入式系统、云应用、科学应用,下文来看具体应用介绍,需要的朋友可以参考一下
    2021-11-11
  • java中maven下载和安装步骤说明

    java中maven下载和安装步骤说明

    在本篇文章里小编给大家分享的是一篇关于java中maven下载和安装步骤说明内容,对此有兴趣的朋友们可以学习参考下。
    2021-02-02
  • Spring Mvc下实现以文件流方式下载文件的方法示例

    Spring Mvc下实现以文件流方式下载文件的方法示例

    这篇文章主要介绍了Spring Mvc下实现以文件流方式下载文件的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论