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

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!  

推薦閱讀: