真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java多線程并行計(jì)算中如何降低接口響應(yīng)時(shí)間

Java多線程并行計(jì)算中如何降低接口響應(yīng)時(shí)間,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括宿松網(wǎng)站建設(shè)、宿松網(wǎng)站制作、宿松網(wǎng)頁制作以及宿松網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,宿松網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到宿松省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

所謂的高并發(fā)除了在架構(gòu)上的高屋建瓴,還得需要開發(fā)人員在具體業(yè)務(wù)開發(fā)中注重自己的每一行代碼、每一個(gè)細(xì)節(jié),面子有的同時(shí),更重要的還是要有里子。

面對(duì)性能,我們一定要有自己的工匠精神,不可以對(duì)任何一行代碼妥協(xié)!

今天和大家分享在業(yè)務(wù)開發(fā)中如何降低接口響應(yīng)時(shí)間的一個(gè)小技巧,也是大家日常開發(fā)中比較普遍存在的一個(gè)問題,即如何提高程序的并行計(jì)算能力?

順序執(zhí)行

很多時(shí)候,我們開發(fā)一個(gè)接口時(shí)候,需要調(diào)用多個(gè)方法,然后將各個(gè)方法返回的數(shù)據(jù)一起組裝返回給前端,比如這樣的:

Java多線程并行計(jì)算中如何降低接口響應(yīng)時(shí)間

可以看到我這里調(diào)用了4個(gè)方法,每一個(gè)方法為模擬真實(shí)耗時(shí),所以都是延遲100ms返回一個(gè)字符串:

Java多線程并行計(jì)算中如何降低接口響應(yīng)時(shí)間

可想而知,我們這個(gè)接口的響應(yīng)時(shí)間一定會(huì)超過400ms,多次執(zhí)行都會(huì)在400ms多一點(diǎn):

耗時(shí):403ms耗時(shí):409ms耗時(shí):406ms

這就是順序執(zhí)行,也許大家覺得很Low,但是想想自己的代碼很多時(shí)候不就是這樣子的么?

線程池+Future并行計(jì)算

順序執(zhí)行確實(shí)很慢,所以我們需要并行執(zhí)行,即同時(shí)調(diào)用這四個(gè)方法,熟悉Java多線程的都知道,每個(gè)方法單獨(dú)開啟一個(gè)線程異步去執(zhí)行就好了,等全部執(zhí)行完了拿到獨(dú)立線程執(zhí)行的結(jié)果再組裝起來就可以了。

但是每次調(diào)用都需要?jiǎng)?chuàng)建四個(gè)線程,線程的創(chuàng)建和銷毀都是需要開銷的,所以我們就有了池化技術(shù)。

線程池、數(shù)據(jù)庫的連接池等都是采用的池化技術(shù):預(yù)先初始生成創(chuàng)建好的線程,等需要調(diào)用的時(shí)候拿來即用,線程完成工作后回歸空閑狀態(tài),等待下一次任務(wù)的到來,這樣就避免了線程頻繁的創(chuàng)建、銷毀,提高了程序的響應(yīng)性能。

所以我們?cè)谧霾⑿杏?jì)算的時(shí)候一定要充分的利用線程池的相關(guān)技術(shù),關(guān)于線程池的技術(shù)在我的另外一篇文章單獨(dú)講到,不了解的同學(xué)可以初步了解一下,面試也是必會(huì)題之一:

Java線程池基礎(chǔ)掃盲

下面我們直接上代碼:

Java多線程并行計(jì)算中如何降低接口響應(yīng)時(shí)間

線程池+Future

多運(yùn)行幾次,看輸出響應(yīng)時(shí)間:

耗時(shí):108ms耗時(shí):105ms耗時(shí):105ms

效果是不是很明顯?

直接相當(dāng)于一個(gè)方法的調(diào)用耗時(shí),實(shí)際開發(fā)中如果你的一個(gè)接口經(jīng)過壓測(cè)耗時(shí)在100ms左右(大多數(shù)正規(guī)公司對(duì)接口性能都會(huì)要求不超過100ms),那么再通過線程池+Future并行計(jì)算的方式,并可以瞬間將你的接口性能提高上去,再也不用擔(dān)心壓測(cè)不過了。

有時(shí)候測(cè)試同學(xué)告訴你接口壓測(cè)不過是不是覺得很沒面子?那是對(duì)你職業(yè)水平很大的否定~

Java8的CompletableFuture

Future是java.util.concurrent并發(fā)包中的接口類,用來表示一個(gè)線程異步執(zhí)行后的結(jié)果,有如下核心方法:

  • Future.get():阻塞調(diào)用線程,直到計(jì)算結(jié)果返回

  • Future.isDone():判斷線程是否執(zhí)行完畢

  • Future.cancel():取消當(dāng)前線程的執(zhí)行

我們可以知道的是,F(xiàn)uture.get()是阻塞調(diào)用的,要想拿到線程執(zhí)行的結(jié)果,必須是Future.get()阻塞或者while(Future.isDone())輪詢方式調(diào)用。這種方式叫“主動(dòng)拉(pull)”,現(xiàn)在都流行響應(yīng)式編程,即“主動(dòng)推(push)”的方式,當(dāng)線程執(zhí)行完了,你告訴我就好了。

Java8設(shè)計(jì)了CompletableFuture這樣的一個(gè)類,我們先來看看如何用CompletableFuture來開發(fā)之前的代碼:

Java多線程并行計(jì)算中如何降低接口響應(yīng)時(shí)間

CompletableFuture并行計(jì)算

這里可以看到實(shí)現(xiàn)方式和Future并沒有什么不同,但是CompletableFuture提供了很多方便的方法,比如代碼中的allOf,thenApplyAsync,可以將多個(gè)CompletableFuture組合成一個(gè)CompletableFuture,最后調(diào)用join方法阻塞拿到結(jié)果。多次調(diào)用該接口耗時(shí)如下:

耗時(shí):110ms耗時(shí):108ms耗時(shí):105ms

CompletableFuture類中有很多的方法(50+)可以供大家使用,不像Future只要那么幾個(gè)方法可以使用,這也是Java自有庫對(duì)Future的一個(gè)增強(qiáng)。

這里只是簡單展示了CompletableFuture的一種用法,實(shí)際開發(fā)中大家需要根據(jù)不同的場景去選擇使用不同的方法,這里對(duì)API不做具體介紹了。

Guava的ListenableFuture

總是有一些牛逼的公司牛逼的人出一些牛逼的開源組件要比官方自帶的工具類要好得多,同樣,谷歌開源的Guava中的ListenableFuture接口對(duì)java自帶的Future接口做了進(jìn)一步拓展,并且提供了靜態(tài)工具類Futures。

針對(duì)上面的代碼,我們看如何使用ListenableFuture來實(shí)現(xiàn)(與之前不同的是,Guava中需要對(duì)線程池再進(jìn)行一次包裝):

Java多線程并行計(jì)算中如何降低接口響應(yīng)時(shí)間

執(zhí)行三次請(qǐng)求耗時(shí):

耗時(shí):103ms耗時(shí):101ms耗時(shí):103ms

看完上述內(nèi)容,你們掌握J(rèn)ava多線程并行計(jì)算中如何降低接口響應(yīng)時(shí)間的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


當(dāng)前名稱:Java多線程并行計(jì)算中如何降低接口響應(yīng)時(shí)間
分享地址:http://weahome.cn/article/gdijgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部