您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java多線程異步調用性能如何調優”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java多線程異步調用性能如何調優”文章能幫助大家解決問題。
大型電商公司的支付聚合服務都有這類的場景:
調用校驗服務校驗待生成的訂單是否合法
訂單服務生成訂單(校驗服務和訂單服務沒有依賴關系)
調用1和2,支付服務實現支付核心的功能
結合步驟1至3完成支付服務的聚合調用
假如步驟1的耗時5秒,步驟2的耗時3秒,步驟3的耗時2秒,如果你是架構師,要求:
1.請實現微服務的同步調用
2.請實現微服務的異步調用(使用CompletableFuture實現)
比較1和2的性能.
Future直接表述多個Future結果之間的依賴性,有一定的缺陷:
1.將兩個異步計算合并為一個(第二個異步計算依賴于第一個的結果),這個用Future不太好實現.
2.等待Future集合中的所有的任務都完成
僅等待Future集合中最快結束的任務完成,并返回它的結果
https://gitee.com/zjvngvn/mutil-thread
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"); } }
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; } }
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; } }
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多線程異步調用性能如何調優”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。