所謂的高並發除了在架構上的高屋建瓴,還得需要開發人員在具體業務開發中注重自己的每一行代碼、每一個細節,面子有的同時,更重要的還是要有裏子。
可以看到我這裏調用了4個方法,每一個方法爲模擬真實耗時,所以都是延遲100ms返回一個字符串:
線程池+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來開發之前的代碼:
執行三次請求耗時:
耗時:103ms 耗時:101ms 耗時:103ms最後
以上就是如何讓自己的接口並行計算起來的三種實現方式,屬于日常開發中比較常用的一個小技巧,這裏沒有過多說明這三種方式的具體區別,實際上還需要大家不斷的在開發中去使用,查閱更多相關源碼和資料,只有等你真正用起來的時候,你才能有所體會!
感謝各位的閱讀,如果這篇文章對您有幫助,歡迎“點贊+轉發”!關注“java架構設計”獲取更多免費技術文章幹貨!


