您好,登錄后才能下訂單哦!
Java多線程并行計算中如何降低接口響應時間,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
所謂的高并發除了在架構上的高屋建瓴,還得需要開發人員在具體業務開發中注重自己的每一行代碼、每一個細節,面子有的同時,更重要的還是要有里子。
面對性能,我們一定要有自己的工匠精神,不可以對任何一行代碼妥協!
今天和大家分享在業務開發中如何降低接口響應時間的一個小技巧,也是大家日常開發中比較普遍存在的一個問題,即如何提高程序的并行計算能力?
順序執行
很多時候,我們開發一個接口時候,需要調用多個方法,然后將各個方法返回的數據一起組裝返回給前端,比如這樣的:
可以看到我這里調用了4個方法,每一個方法為模擬真實耗時,所以都是延遲100ms返回一個字符串:
可想而知,我們這個接口的響應時間一定會超過400ms,多次執行都會在400ms多一點:
耗時:403ms耗時:409ms耗時:406ms
這就是順序執行,也許大家覺得很Low,但是想想自己的代碼很多時候不就是這樣子的么?
線程池+Future并行計算
順序執行確實很慢,所以我們需要并行執行,即同時調用這四個方法,熟悉Java多線程的都知道,每個方法單獨開啟一個線程異步去執行就好了,等全部執行完了拿到獨立線程執行的結果再組裝起來就可以了。
但是每次調用都需要創建四個線程,線程的創建和銷毀都是需要開銷的,所以我們就有了池化技術。
線程池、數據庫的連接池等都是采用的池化技術:預先初始生成創建好的線程,等需要調用的時候拿來即用,線程完成工作后回歸空閑狀態,等待下一次任務的到來,這樣就避免了線程頻繁的創建、銷毀,提高了程序的響應性能。
所以我們在做并行計算的時候一定要充分的利用線程池的相關技術,關于線程池的技術在我的另外一篇文章單獨講到,不了解的同學可以初步了解一下,面試也是必會題之一:
Java線程池基礎掃盲
下面我們直接上代碼:
線程池+Future
多運行幾次,看輸出響應時間:
耗時:108ms耗時:105ms耗時:105ms
效果是不是很明顯?
直接相當于一個方法的調用耗時,實際開發中如果你的一個接口經過壓測耗時在100ms左右(大多數正規公司對接口性能都會要求不超過100ms),那么再通過線程池+Future并行計算的方式,并可以瞬間將你的接口性能提高上去,再也不用擔心壓測不過了。
有時候測試同學告訴你接口壓測不過是不是覺得很沒面子?那是對你職業水平很大的否定~
Java8的CompletableFuture
Future是java.util.concurrent并發包中的接口類,用來表示一個線程異步執行后的結果,有如下核心方法:
Future.get():阻塞調用線程,直到計算結果返回
Future.isDone():判斷線程是否執行完畢
Future.cancel():取消當前線程的執行
我們可以知道的是,Future.get()是阻塞調用的,要想拿到線程執行的結果,必須是Future.get()阻塞或者while(Future.isDone())輪詢方式調用。這種方式叫“主動拉(pull)”,現在都流行響應式編程,即“主動推(push)”的方式,當線程執行完了,你告訴我就好了。
Java8設計了CompletableFuture這樣的一個類,我們先來看看如何用CompletableFuture來開發之前的代碼:
CompletableFuture并行計算
這里可以看到實現方式和Future并沒有什么不同,但是CompletableFuture提供了很多方便的方法,比如代碼中的allOf,thenApplyAsync,可以將多個CompletableFuture組合成一個CompletableFuture,最后調用join方法阻塞拿到結果。多次調用該接口耗時如下:
耗時:110ms耗時:108ms耗時:105ms
CompletableFuture類中有很多的方法(50+)可以供大家使用,不像Future只要那么幾個方法可以使用,這也是Java自有庫對Future的一個增強。
這里只是簡單展示了CompletableFuture的一種用法,實際開發中大家需要根據不同的場景去選擇使用不同的方法,這里對API不做具體介紹了。
Guava的ListenableFuture
總是有一些牛逼的公司牛逼的人出一些牛逼的開源組件要比官方自帶的工具類要好得多,同樣,谷歌開源的Guava中的ListenableFuture接口對java自帶的Future接口做了進一步拓展,并且提供了靜態工具類Futures。
針對上面的代碼,我們看如何使用ListenableFuture來實現(與之前不同的是,Guava中需要對線程池再進行一次包裝):
執行三次請求耗時:
耗時:103ms耗時:101ms耗時:103ms
看完上述內容,你們掌握Java多線程并行計算中如何降低接口響應時間的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。