SpringBoot 巧用 @Async 提升接口并發(fā)能力
閱讀本文大概需要 4 分鐘。
來(lái)自:blog.csdn.net/weixin_34186931/article/details/89564480
同步調(diào)用
@Component??
public?class?Task?{??
???
????public?static?Random?random?=new?Random();??
???
????public?void?doTaskOne()?throws?Exception?{??
????????System.out.println("開(kāi)始做任務(wù)一");??
????????long?start?=?System.currentTimeMillis();??
????????Thread.sleep(random.nextInt(10000));??
????????long?end?=?System.currentTimeMillis();??
????????System.out.println("完成任務(wù)一,耗時(shí):"?+?(end?-?start)?+?"毫秒");??
????}??
???
????public?void?doTaskTwo()?throws?Exception?{??
????????System.out.println("開(kāi)始做任務(wù)二");??
????????long?start?=?System.currentTimeMillis();??
????????Thread.sleep(random.nextInt(10000));??
????????long?end?=?System.currentTimeMillis();??
????????System.out.println("完成任務(wù)二,耗時(shí):"?+?(end?-?start)?+?"毫秒");??
????}??
???
????public?void?doTaskThree()?throws?Exception?{??
????????System.out.println("開(kāi)始做任務(wù)三");??
????????long?start?=?System.currentTimeMillis();??
????????Thread.sleep(random.nextInt(10000));??
????????long?end?=?System.currentTimeMillis();??
????????System.out.println("完成任務(wù)三,耗時(shí):"?+?(end?-?start)?+?"毫秒");??
????}??
???
}??
@RunWith(SpringJUnit4ClassRunner.class)?@SpringApplicationConfiguration(classes?=?Application.class)?
public?class?ApplicationTests?{??
???
????@Autowired??
????private?Task?task;??
???
????@Test??
????public?void?test()?throws?Exception?{??
????????task.doTaskOne();??
????????task.doTaskTwo();??
????????task.doTaskThree();??
????}??
???
}??
開(kāi)始做任務(wù)一??
完成任務(wù)一,耗時(shí):4256毫秒??
開(kāi)始做任務(wù)二??
完成任務(wù)二,耗時(shí):4957毫秒??
開(kāi)始做任務(wù)三??
完成任務(wù)三,耗時(shí):7173毫秒??
異步調(diào)用
@Component??
public?class?Task?{??
???
????@Async??
????public?void?doTaskOne()?throws?Exception?{??
????????//?同上內(nèi)容,省略??
????}??
???
????@Async??
????public?void?doTaskTwo()?throws?Exception?{??
????????//?同上內(nèi)容,省略??
????}??
???
????@Async??
????public?void?doTaskThree()?throws?Exception?{??
????????//?同上內(nèi)容,省略??
????}??
???
}??
@Async注解能夠生效,還需要在Spring Boot的主程序中配置@EnableAsync,如下所示:@SpringBootApplication??
@EnableAsync??
public?class?Application?{??
???
????public?static?void?main(String[]?args)?{??
????????SpringApplication.run(Application.class,?args);??
????}??
???
}??
沒(méi)有任何任務(wù)相關(guān)的輸出
有部分任務(wù)相關(guān)的輸出
亂序的任務(wù)相關(guān)的輸出
注:@Async所修飾的函數(shù)不要定義為static類型,這樣異步調(diào)用不會(huì)生效
異步回調(diào)
@Async??
public?Future?doTaskOne()?throws?Exception? {??
????System.out.println("開(kāi)始做任務(wù)一");??
????long?start?=?System.currentTimeMillis();??
????Thread.sleep(random.nextInt(10000));??
????long?end?=?System.currentTimeMillis();??
????System.out.println("完成任務(wù)一,耗時(shí):"?+?(end?-?start)?+?"毫秒");??
????return?new?AsyncResult<>("任務(wù)一完成");??
}??
@Test??
public?void?test()?throws?Exception?{??
???
????long?start?=?System.currentTimeMillis();??
???
????Future?task1?=?task.doTaskOne();??
????Future?task2?=?task.doTaskTwo();??
????Future?task3?=?task.doTaskThree();??
???
????while(true)?{??
????????if(task1.isDone()?&&?task2.isDone()?&&?task3.isDone())?{??
????????????//?三個(gè)任務(wù)都調(diào)用完成,退出循環(huán)等待??
????????????break;??
????????}??
????????Thread.sleep(1000);??
????}??
???
????long?end?=?System.currentTimeMillis();??
???
????System.out.println("任務(wù)全部完成,總耗時(shí):"?+?(end?-?start)?+?"毫秒");??
???
}??
在測(cè)試用例一開(kāi)始記錄開(kāi)始時(shí)間
在調(diào)用三個(gè)異步函數(shù)的時(shí)候,返回Future類型的結(jié)果對(duì)象
在調(diào)用完三個(gè)異步函數(shù)之后,開(kāi)啟一個(gè)循環(huán),根據(jù)返回的Future對(duì)象來(lái)判斷三個(gè)異步函數(shù)是否都結(jié)束了。若都結(jié)束,就結(jié)束循環(huán);若沒(méi)有都結(jié)束,就等1秒后再判斷。
結(jié)束時(shí)間 - 開(kāi)始時(shí)間,計(jì)算出三個(gè)任務(wù)并發(fā)執(zhí)行的總耗時(shí)。開(kāi)始做任務(wù)一??
開(kāi)始做任務(wù)二??
開(kāi)始做任務(wù)三??
完成任務(wù)三,耗時(shí):37毫秒??
完成任務(wù)二,耗時(shí):3661毫秒??
完成任務(wù)一,耗時(shí):7149毫秒??
任務(wù)全部完成,總耗時(shí):8025毫秒??
推薦閱讀:
確診新冠小米員工的活動(dòng)軌跡曝光!這就是人間真實(shí)嗎?
ConcurrentHashMap面試靈魂拷問(wèn),你能扛多久?
內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper、數(shù)據(jù)結(jié)構(gòu)、限流熔斷降級(jí)......等技術(shù)棧!
?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?
評(píng)論
圖片
表情

