Java多線(xiàn)程異步調(diào)用性能調(diào)優(yōu)方法詳解
概述
大型電商公司的支付聚合服務(wù)都有這類(lèi)的場(chǎng)景:
- 調(diào)用校驗(yàn)服務(wù)校驗(yàn)待生成的訂單是否合法
- 訂單服務(wù)生成訂單(校驗(yàn)服務(wù)和訂單服務(wù)沒(méi)有依賴(là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的性能.?
同步調(diào)用和異步調(diào)用

Future類(lèi)圖

Future的不足

Future直接表述多個(gè)Future結(jié)果之間的依賴(lài)性,有一定的缺陷:
1.將兩個(gè)異步計(jì)算合并為一個(gè)(第二個(gè)異步計(jì)算依賴(lài)于第一個(gè)的結(jié)果),這個(gè)用Future不太好實(shí)現(xiàn).
2.等待Future集合中的所有的任務(wù)都完成
僅等待Future集合中最快結(jié)束的任務(wù)完成,并返回它的結(jié)果
代碼
代碼地址
https://gitee.com/zjvngvn/mutil-thread
Test
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");
}
}
PaymentService
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)部類(lè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;
}
}
CheckService
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;
}
}
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();
}
//假設(shè)訂單數(shù)量為1
return orderSum;
}
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
一文教你學(xué)會(huì)搭建SpringBoot分布式項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了搭建SpringBoot分布式項(xiàng)目的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
Spring mvc整合mybatis(crud+分頁(yè)插件)操作mysql
這篇文章主要介紹了Spring mvc整合mybatis(crud+分頁(yè)插件)操作mysql的步驟詳解,需要的朋友可以參考下2017-04-04
深入解讀Java代碼組織中的package包結(jié)構(gòu)
這篇文章主要介紹了Java代碼組織中的package包結(jié)構(gòu),是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-03-03
java實(shí)現(xiàn)基于TCP協(xié)議網(wǎng)絡(luò)socket編程(C/S通信)
這篇文章主要介紹了java實(shí)現(xiàn)基于TCP協(xié)議網(wǎng)絡(luò)socket編程(C/S通信),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java static方法用法實(shí)戰(zhàn)案例總結(jié)
這篇文章主要介紹了Java static方法用法,結(jié)合具體案例形式總結(jié)分析了java static方法功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
java中對(duì)象為null時(shí)的打印輸出方式
這篇文章主要介紹了java中對(duì)象為null時(shí)的打印輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
SpringBoot如何接收數(shù)組參數(shù)的方法
這篇文章主要介紹了SpringBoot如何接收數(shù)組參數(shù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

