Java マルチスレッド非同期呼び出しのパフォーマンスを調整する方法

王林
リリース: 2023-05-04 23:52:05
転載
1071 人が閲覧しました
    #概要

    大手電子商取引企業の支払い集約サービスはすべて、次のようなシナリオを持っています:

    • 検証サービスを呼び出して、生成される注文が合法かどうかを確認します

    • ##注文サービスは注文を生成します (検証サービスと注文サービスには依存関係がありません) )
    • 呼び出し 1 と 2、支払いサービスは支払いコア機能を実装します
    • ステップ 1 から 3 を組み合わせて、支払いサービス
    • ステップ 1 に 5 秒かかり、ステップ 2 に 3 秒かかり、ステップ 3 に 2 秒かかる場合、アーキテクトの場合、要件は次のとおりです。

    1. マイクロサービス Call の同期を実装してください

    2. マイクロサービスの非同期呼び出しを実装してください (CompletableFuture を使用して実装)

    1 と 2 のパフォーマンスを比較してください。

    同期呼び出しと非同期呼び出し

    Java マルチスレッド非同期呼び出しのパフォーマンスを調整する方法Future クラス図

    #Future の欠点Java マルチスレッド非同期呼び出しのパフォーマンスを調整する方法

    #Future には多くの直接的な式があります Future の結果間の依存関係には特定の欠陥があります: Java マルチスレッド非同期呼び出しのパフォーマンスを調整する方法

    1. 2 つの非同期計算を 1 つにマージします (2 番目の非同期計算は最初の非同期計算の結果に依存します)。 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 マルチスレッド非同期呼び出しのパフォーマンスを調整する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート