欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程異步調(diào)用性能調(diào)優(yōu)方法詳解

 更新時(shí)間:2022年03月07日 11:49:29   作者:張俊杰1994  
這篇文章主要為大家詳細(xì)介紹了Java多線程異步調(diào)用性能調(diào)優(yōu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

概述

大型電商公司的支付聚合服務(wù)都有這類的場(chǎng)景:

  • 調(diào)用校驗(yàn)服務(wù)校驗(yàn)待生成的訂單是否合法
  • 訂單服務(wù)生成訂單(校驗(yàn)服務(wù)和訂單服務(wù)沒(méi)有依賴關(guān)系)
  • 調(diào)用1和2,支付服務(wù)實(shí)現(xiàn)支付核心的功能
  • 結(jié)合步驟1至3完成支付服務(wù)的聚合調(diào)用

?假如步驟1的耗時(shí)5秒,步驟2的耗時(shí)3秒,步驟3的耗時(shí)2秒,如果你是架構(gòu)師,要求:?

1.請(qǐng)實(shí)現(xiàn)微服務(wù)的同步調(diào)用

2.請(qǐng)實(shí)現(xiàn)微服務(wù)的異步調(diào)用(使用CompletableFuture實(shí)現(xiàn))

比較1和2的性能.?

同步調(diào)用和異步調(diào)用

image.png

Future類圖

image.png

Future的不足

image.png

Future直接表述多個(gè)Future結(jié)果之間的依賴性,有一定的缺陷:

1.將兩個(gè)異步計(jì)算合并為一個(gè)(第二個(gè)異步計(jì)算依賴于第一個(gè)的結(jié)果),這個(gè)用Future不太好實(shí)現(xiàn).

2.等待Future集合中的所有的任務(wù)都完成

僅等待Future集合中最快結(jié)束的任務(wù)完成,并返回它的結(jié)果

代碼

代碼地址

https://gitee.com/zjvngvn/mutil-thread

Test

public class Test {
    public static void main(String[] args) {
    	// 同步調(diào)用
        long start1 = System.currentTimeMillis();
        PaymentService.syncPay();
        System.out.println("同步支付耗時(shí):" + (System.currentTimeMillis() - start1)+" ms");
        System.out.println("=========================");
        // 異步調(diào)用
        long start2 = System.currentTimeMillis();
        PaymentService.asyncPay();
        System.out.println("異步支付耗時(shí):" + (System.currentTimeMillis() - start2)+" ms");
    }
}

PaymentService

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class PaymentService {
    /**
     * 異步支付的入口方法
     *
     * @return
     */
    public static boolean asyncPay() {
        //校驗(yàn)
        CompletableFuture<Boolean> isValid = CompletableFuture.supplyAsync(() -> CheckService.isValid());
        //創(chuàng)建訂單
        CompletableFuture<Integer> orderSum = CompletableFuture.supplyAsync(() -> OrderService.createOrder());
        //支付
        CompletableFuture<Integer> money = CompletableFuture.supplyAsync(() -> basePay());
        // 上面三個(gè)都完成之后,再進(jìn)行下面匿名內(nèi)部類的代碼
        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("同步支付成功");
        //假設(shè)支付成功
        return true;
    }
    public static int basePay() {
        int money = 1000;
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("支付");
        //假設(shè)支付成功
        return money;
    }
}

CheckService

import java.util.concurrent.TimeUnit;
public class CheckService {
	/**
	 * 返回true說(shuō)明訂單流程才會(huì)往下走
	 */
    public static boolean isValid() {
        System.out.println("訂單生成前,檢驗(yàn)訂單是否合法" );
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //假設(shè)訂單合法,通過(guò)校驗(yàn)
        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();
        }
        //假設(shè)訂單數(shù)量為1
        return orderSum;
    }
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • 詳解Java文件下載的幾種實(shí)現(xiàn)方式

    詳解Java文件下載的幾種實(shí)現(xiàn)方式

    這篇文章主要介紹了詳解Java文件下載的幾種實(shí)現(xiàn)方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • SpringBoot中Aware接口使用及原理解析

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

    在Spring中存在一個(gè)Aware接口,實(shí)現(xiàn)該接口可以讓我們的Bean獲取到Spring容器中特定的資源,但該接口只是個(gè)標(biāo)記接口,不存在任何方法,本文將給大家詳細(xì)介紹一下SpringBoot中Aware接口使用及原理,需要的朋友可以參考下
    2023-08-08
  • Mybatis-Plus實(shí)現(xiàn)自動(dòng)生成代碼的操作步驟

    Mybatis-Plus實(shí)現(xiàn)自動(dòng)生成代碼的操作步驟

    AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過(guò) AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個(gè)模塊的代碼,極大的提升了開(kāi)發(fā)效率,本文將給大家介紹Mybatis-Plus實(shí)現(xiàn)自動(dòng)生成代碼的操作步驟
    2023-10-10
  • java使用xpath解析xml示例分享

    java使用xpath解析xml示例分享

    XPath基于XML的樹(shù)狀結(jié)構(gòu),提供在數(shù)據(jù)結(jié)構(gòu)樹(shù)中找尋節(jié)點(diǎn)的能力,下面是一小示例,需要的朋友可以參考下
    2014-03-03
  • JVM 方法調(diào)用之靜態(tài)分派(詳解)

    JVM 方法調(diào)用之靜態(tài)分派(詳解)

    下面小編就為大家?guī)?lái)一篇JVM 方法調(diào)用之靜態(tài)分派(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java中上傳圖片壓縮處理的方法示例

    Java中上傳圖片壓縮處理的方法示例

    本篇文章主要介紹了Java中圖片壓縮處理的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • Spring注解開(kāi)發(fā)生命周期原理解析

    Spring注解開(kāi)發(fā)生命周期原理解析

    這篇文章主要介紹了Spring注解開(kāi)發(fā)生命周期原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java 在生活中的 10 大應(yīng)用

    Java 在生活中的 10 大應(yīng)用

    這篇文章主要給大家分享Java 在生活中的 10 大應(yīng)用,桌面圖形用戶界面、移動(dòng)應(yīng)用、人工智能、網(wǎng)絡(luò)應(yīng)用程序、大數(shù)據(jù)技術(shù)、游戲應(yīng)用、商業(yè)應(yīng)用、嵌入式系統(tǒng)、云應(yīng)用、科學(xué)應(yīng)用,下文來(lái)看具體應(yīng)用介紹,需要的朋友可以參考一下
    2021-11-11
  • java中maven下載和安裝步驟說(shuō)明

    java中maven下載和安裝步驟說(shuō)明

    在本篇文章里小編給大家分享的是一篇關(guān)于java中maven下載和安裝步驟說(shuō)明內(nèi)容,對(duì)此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例

    Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例

    這篇文章主要介紹了Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05

最新評(píng)論