溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java多線程異步調(diào)用性能如何調(diào)優(yōu)

發(fā)布時(shí)間:2022-03-07 15:10:59 來源:億速云 閱讀:203 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java多線程異步調(diào)用性能如何調(diào)優(yōu)”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Java多線程異步調(diào)用性能如何調(diào)優(yōu)”文章能幫助大家解決問題。

    概述

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

    • 調(diào)用校驗(yàn)服務(wù)校驗(yàn)待生成的訂單是否合法

    • 訂單服務(wù)生成訂單(校驗(yàn)服務(wù)和訂單服務(wù)沒有依賴關(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)用

    Java多線程異步調(diào)用性能如何調(diào)優(yōu)

    Future類圖

    Java多線程異步調(diào)用性能如何調(diào)優(yōu)

    Future的不足

    Java多線程異步調(diào)用性能如何調(diào)優(yōu)

    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說明訂單流程才會(huì)往下走
    	 */
        public static boolean isValid() {
            System.out.println("訂單生成前,檢驗(yàn)訂單是否合法" );
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //假設(shè)訂單合法,通過校驗(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;
        }
    }

    關(guān)于“Java多線程異步調(diào)用性能如何調(diào)優(yōu)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI