成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你應該這樣去開發接口:Java多線程并行計算

開發 后端
所謂的高并發除了在架構上的高屋建瓴,還得需要開發人員在具體業務開發中注重自己的每一行代碼、每一個細節,面子有的同時,更重要的還是要有里子。

 所謂的高并發除了在架構上的高屋建瓴,還得需要開發人員在具體業務開發中注重自己的每一行代碼、每一個細節,面子有的同時,更重要的還是要有里子。

[[313379]]

 

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

今天和大家分享在業務開發中如何降低接口響應時間的一個小技巧,也是大家日常開發中比較普遍存在的一個問題,即如何提高程序的并行計算能力?

本文主要包含以下內容:

  1. 順序執行很慢
  2. 線程池+Future并行計算
  3. 使用Java8的CompletableFuture
  4. 使用Guava的ListenableFuture

本文包含代碼內容較多,大家可收藏后自己跟著動手驗證一番~

順序執行

很多時候,我們開發一個接口時候,需要調用多個方法,然后將各個方法返回的數據一起組裝返回給前端,比如這樣的:

 

你應該這樣去開發接口:Java多線程并行計算

 

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

 

你應該這樣去開發接口:Java多線程并行計算

 

可想而知,我們這個接口的響應時間一定會超過400ms,多次執行都會在400ms多一點:

耗時:403ms耗時:409ms耗時:406ms

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

線程池+Future并行計算

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

但是每次調用都需要創建四個線程,線程的創建和銷毀都是需要開銷的,所以我們就有了池化技術。

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

所以我們在做并行計算的時候一定要充分的利用線程池的相關技術,關于線程池的技術在我的另外一篇文章單獨講到,不了解的同學可以初步了解一下,面試也是必會題之一:

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來開發之前的代碼:

 

你應該這樣去開發接口:Java多線程并行計算

 

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中需要對線程池再進行一次包裝):

 

你應該這樣去開發接口:Java多線程并行計算

 

執行三次請求耗時:

耗時:103ms耗時:101ms耗時:103ms

最后

以上就是如何讓自己的接口并行計算起來的三種實現方式,屬于日常開發中比較常用的一個小技巧,這里沒有過多說明這三種方式的具體區別,實際上還需要大家不斷的在開發中去使用,查閱更多相關源碼和資料,只有等你真正用起來的時候,你才能有所體會!

責任編輯:華軒 來源: 今日頭條
相關推薦

2010-03-22 14:45:40

云計算

2021-06-01 05:51:37

云計算并行計算分布式計算

2023-10-30 08:57:19

.Net開發并行計算

2011-04-21 09:13:14

并行計算

2012-08-17 09:32:52

Python

2011-04-20 17:15:21

并行計算

2009-12-18 09:38:27

.NET 4.0并行計

2010-03-19 17:23:45

云計算

2014-04-24 10:25:15

2011-05-12 11:01:26

HTML

2021-09-09 07:16:00

C#多線程開發

2019-04-18 09:15:05

DaskPython計算

2014-01-21 11:16:59

MPI并行計算

2011-08-29 10:40:02

浪潮英特爾并行計算

2021-06-16 09:10:29

APP開發AndroidiOS

2010-03-11 15:23:44

Visual Stud

2010-04-21 09:23:09

.NET 4

2010-06-10 08:37:04

并行計算

2017-04-24 12:07:44

Spark大數據并行計算

2010-04-27 17:23:34

AIX系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 韩国成人在线视频 | 亚洲一区二区av在线 | 国产在线高清 | 国产在线观看一区二区 | a久久久久久| 韩国成人在线视频 | 欧美日韩成人 | 日韩字幕一区 | 密室大逃脱第六季大神版在线观看 | 黄视频免费| 特黄视频 | 91精品国产91久久久久久吃药 | 亚洲精品亚洲人成人网 | 精品国产乱码久久久久久蜜退臀 | 亚洲国产成人久久久 | 日韩精品久久 | 亚洲高清成人在线 | 欧美中文在线 | 污污的网站在线观看 | 丝袜久久 | 日韩一二区在线观看 | 欧美三区在线观看 | 欧美性受xxxx白人性爽 | 久久久亚洲| 一区二区三 | 国产婷婷精品av在线 | 久久草视频 | 久久久一二三区 | 欧美日韩在线精品 | 亚洲欧美日韩精品久久亚洲区 | 欧美一区不卡 | 亚洲日本乱码在线观看 | 91久久久www播放日本观看 | 老子午夜影院 | 日韩精品二区 | 久久精品免费 | 男插女下体视频 | 精品婷婷 | 久久精品欧美一区二区三区不卡 | 黄色毛片在线看 | 日韩成人|