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

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

王林
王林転載
2023-05-04 23:52:051056ブラウズ
    #概要

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

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

    • ##注文サービスは注文を生成します (検証サービスと注文サービスには依存関係がありません) )
    • 呼び出し 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 までご連絡ください。