您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java多線程異步調(diào)用性能怎么調(diào)優(yōu)的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
大型電商公司的支付聚合服務(wù)都有這類的場(chǎng)景:
調(diào)用校驗(yàn)服務(wù)校驗(yàn)待生成的訂單是否合法
訂單服務(wù)生成訂單(校驗(yàn)服務(wù)和訂單服務(wù)沒(méi)有依賴關(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的性能.
Future直接表述多個(gè)Future結(jié)果之間的依賴性,有一定的缺陷:
1.將兩個(gè)異步計(jì)算合并為一個(gè)(第二個(gè)異步計(jì)算依賴于第一個(gè)的結(jié)果),這個(gè)用Future不太好實(shí)現(xiàn).
2.等待Future集合中的所有的任務(wù)都完成
僅等待Future集合中最快結(jié)束的任務(wù)完成,并返回它的結(jié)果
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"); } }
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; } }
import java.util.concurrent.TimeUnit; public class CheckService { /** * 返回true說(shuō)明訂單流程才會(huì)往下走 */ public static boolean isValid() { System.out.println("訂單生成前,檢驗(yàn)訂單是否合法" ); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } //假設(shè)訂單合法,通過(guò)校驗(yàn) 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(); } //假設(shè)訂單數(shù)量為1 return orderSum; } }
以上就是“Java多線程異步調(diào)用性能怎么調(diào)優(yōu)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(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)容。