[線程池]Springboot如何使用線程池
本文帶你快速了解@Async注解的用法,包括異步方法無返回值、有返回值,最后總結了@Async注解失效的幾個坑。
在 SpringBoot 應用中,經常會遇到在一個接口中,同時做事情1,事情2,事情3,如果同步執行的話,則本次接口時間取決于事情1 2 3執行時間之和;如果三件事同時執行,則本次接口時間取決于事情1 2 3執行時間最長的那個,合理使用多線程,可以大大縮短接口時間。那么在 SpringBoot 應用中如何優雅的使用多線程呢?
Don"t bb, show me code.
(相關資料圖)
快速使用
SpringBoot應用中需要添加@EnableAsync
注解,來開啟異步調用,一般還會配置一個線程池,異步的方法交給特定的線程池完成,如下:
@Configuration@EnableAsyncpublic class AsyncConfiguration { @Bean("doSomethingExecutor") public Executor doSomethingExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 核心線程數:線程池創建時候初始化的線程數 executor.setCorePoolSize(10); // 最大線程數:線程池最大的線程數,只有在緩沖隊列滿了之后才會申請超過核心線程數的線程 executor.setMaxPoolSize(20); // 緩沖隊列:用來緩沖執行任務的隊列 executor.setQueueCapacity(500); // 允許線程的空閑時間60秒:當超過了核心線程之外的線程在空閑時間到達之后會被銷毀 executor.setKeepAliveSeconds(60); // 線程池名的前綴:設置好了之后可以方便我們定位處理任務所在的線程池 executor.setThreadNamePrefix("do-something-"); // 緩沖隊列滿了之后的拒絕策略:由調用線程處理(一般是主線程) executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); executor.initialize(); return executor; }}
使用的方式非常簡單,在需要異步的方法上加@Async
注解
@RestControllerpublic class AsyncController { @Autowired private AsyncService asyncService; @GetMapping("/open/something") public String something() { int count = 10; for (int i = 0; i < count; i++) { asyncService.doSomething("index = " + i); } lon return "success"; }}@Slf4j@Servicepublic class AsyncService { // 指定使用beanname為doSomethingExecutor的線程池 @Async("doSomethingExecutor") public String doSomething(String message) { log.info("do something, message={}", message); try { Thread.sleep(1000); } catch (InterruptedException e) { log.error("do something error: ", e); } return message; }}
訪問:127.0.0.1:8080/open/something,日志如下
2020-04-19 23:42:42.486 INFO 21168 --- [io-8200-exec-17] x.g.b.system.controller.AsyncController : do something end, time 8 milliseconds2020-04-19 23:42:42.488 INFO 21168 --- [ do-something-1] x.gits.boot.system.service.AsyncService : do something, message=index = 02020-04-19 23:42:42.488 INFO 21168 --- [ do-something-5] x.gits.boot.system.service.AsyncService : do something, message=index = 42020-04-19 23:42:42.488 INFO 21168 --- [ do-something-4] x.gits.boot.system.service.AsyncService : do something, message=index = 32020-04-19 23:42:42.488 INFO 21168 --- [ do-something-6] x.gits.boot.system.service.AsyncService : do something, message=index = 52020-04-19 23:42:42.488 INFO 21168 --- [ do-something-9] x.gits.boot.system.service.AsyncService : do something, message=index = 82020-04-19 23:42:42.488 INFO 21168 --- [ do-something-8] x.gits.boot.system.service.AsyncService : do something, message=index = 72020-04-19 23:42:42.488 INFO 21168 --- [do-something-10] x.gits.boot.system.service.AsyncService : do something, message=index = 92020-04-19 23:42:42.488 INFO 21168 --- [ do-something-7] x.gits.boot.system.service.AsyncService : do something, message=index = 62020-04-19 23:42:42.488 INFO 21168 --- [ do-something-2] x.gits.boot.system.service.AsyncService : do something, message=index = 12020-04-19 23:42:42.488 INFO 21168 --- [ do-something-3] x.gits.boot.system.service.AsyncService : do something, message=index = 2
由此可見已經達到異步執行的效果了,并且使用到了咱們配置的線程池。
獲取異步方法返回值
當異步方法有返回值時,如何獲取異步方法執行的返回結果呢?這時需要異步調用的方法帶有返回值CompletableFuture。
CompletableFuture是對Feature的增強,Feature只能處理簡單的異步任務,而CompletableFuture可以將多個異步任務進行復雜的組合。如下:
@RestControllerpublic class AsyncController { @Autowired private AsyncService asyncService; @SneakyThrows @ApiOperation("異步 有返回值") @GetMapping("/open/somethings") public String somethings() { CompletableFuture createOrder = asyncService.doSomething1("create order"); CompletableFuture reduceAccount = asyncService.doSomething2("reduce account"); CompletableFuture saveLog = asyncService.doSomething3("save log"); // 等待所有任務都執行完 CompletableFuture.allOf(createOrder, reduceAccount, saveLog).join(); // 獲取每個任務的返回結果 String result = createOrder.get() + reduceAccount.get() + saveLog.get(); return result; }}@Slf4j@Servicepublic class AsyncService { @Async("doSomethingExecutor") public CompletableFuture doSomething1(String message) throws InterruptedException { log.info("do something1: {}", message); Thread.sleep(1000); return CompletableFuture.completedFuture("do something1: " + message); } @Async("doSomethingExecutor") public CompletableFuture doSomething2(String message) throws InterruptedException { log.info("do something2: {}", message); Thread.sleep(1000); return CompletableFuture.completedFuture("; do something2: " + message); } @Async("doSomethingExecutor") public CompletableFuture doSomething3(String message) throws InterruptedException { log.info("do something3: {}", message); Thread.sleep(1000); return CompletableFuture.completedFuture("; do something3: " + message); }}
訪問接口
C:\Users\Administrator>curl -X GET "http://localhost:8200/open/somethings" -H "accept: */*"do something1: create order; do something2: reduce account; do something3: save log
控制臺上關鍵日志如下:
2020-04-20 00:27:42.238 INFO 5672 --- [ do-something-3] x.gits.boot.system.service.AsyncService : do something3: save log2020-04-20 00:27:42.238 INFO 5672 --- [ do-something-2] x.gits.boot.system.service.AsyncService : do something2: reduce account2020-04-20 00:27:42.238 INFO 5672 --- [ do-something-1] x.gits.boot.system.service.AsyncService : do something1: create order
注意事項
@Async
注解會在以下幾個場景失效,也就是說明明使用了@Async
注解,但就沒有走多線程。
@Component
和@Service
,并且能被Spring掃描到);SpringBoot應用中沒有添加@EnableAsync
注解;在同一個類中,一個方法調用另外一個有@Async注解的方法,注解不會生效。原因是@Async注解的方法,是在代理類中執行的。通過上邊幾個示例,@Async實際還是通過Future或CompletableFuture來異步執行的,Spring又封裝了一下,讓我們使用的更方便。
標簽:
推薦
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
基石藥業2022年年度總收入達4.814億人民幣,包括商業收入3.941億人民幣
截至2022年12月31日止年度,基石藥業收入為4 814億人民幣,比截至2021年12月31日止年度的2 437億人民...
來源: -
-
-
-
-
-
-
-
-
-
-
-
-
-
財富更多》
-
機構白皮書顯示中國消費者呈現三大趨勢
機構白皮書顯示中國消費者呈現三大趨勢-...
-
全球資訊:中國稅務機關曝光六起涉稅案件
中國稅務機關曝光六起涉稅案件---中新社...
-
天天觀速訊丨青海油田超25億立方米天然氣“暖熱”甘青藏
青海油田超25億立方米天然氣“暖熱”甘...
-
看點:中廣核電力:近八成機組業績指標進入世界卓越水平
中廣核電力:近八成機組業績指標進入世...
-
天天觀焦點:硅谷銀行倒閉案沖擊下信用債市場續跌,亞洲投資級美元債利差擴大
硅谷銀行倒閉案沖擊下信用債市場續跌,...
動態更多》
熱點
- realme10系列正式宣布 采用雙曲面屏正面頂部居中挖孔
- 五菱全新微型電動車內飾官圖發布 座椅采用星際形打孔工藝
- 努比亞Z40星空典藏版正式開售 采用微米級油畫筆觸紋理技術
- iQOO11系列正式官宣 首批搭載驍龍8Gen2機型之一
- 海信34英寸帶魚屏顯示器發布 支持165Hz刷新率
- OPPO明年將商用240W超級閃充 新一代電芯支持更高倍率充電
- 第一款Android手機渲染圖曝光 橫向滑蓋設計和全尺寸鍵盤
- 吉利首款純電皮卡11月9日上市 車輛續航里程超過610公里
- 努比亞Z40SPro星空典藏版正式公布 堪稱窄邊框天花板
- vivo無線運動耳機2今日正式上市 首銷只要119元
- 萬物復蘇&百舸爭流 | 美吶2023海南千商游學高端峰會盛大召開!
- 世界快訊:國際油價反彈難掩宏觀惡局,且基本面也呈現兩大利空
- 每日快看:群暉DS423+四盤位NAS發布
- 滾動:3月16日國內原油期貨跌6.57%
- Optex Systems IPO上市
- 焦點消息!沃爾瑪山東公司增資至1.9億美元
- 當前動態:工信部立即查處“3·15”晚會曝光的破解版APP違法違規收集用戶個人信息行為
- 環球最新:OATLY獲得4.25億美元戰略投資
- 【全球時快訊】國家發改委:完善污水垃圾、醫廢、危廢處理收費制度
- 環球速看:佛山照明擬定增募資不超10.95億元 股價跌2.51%
- 天天簡訊:盤點檸萌影視商業版圖 檸萌影視有近400項作品著作權
- 薛童:“六個一”助力武漢智慧城市集約建設
- 世界觀速訊丨8部門:加強疫情監測和常態化預警處置能力建設
- 全球熱點!NYMEX原油或已遇阻68.31美元
- 郵儲銀行江蘇省分行:金融知識宣傳觸達"最后一公里"
- 觀點:勿讓“自媒體”在流量的草原上肆意“狂飆”
- 環球微頭條丨碩放機場公司由無錫蘇州兩地持股 蘇南碩放機場近期變更法定代表人
- 盒馬所售活魚獸藥殘留超標被罰
- 【環球快播報】威爾仕健身商業版圖盤點 涉多個服務合同糾紛
- 觀點:迪斯尼維權:希望谷歌和Reddit識別蟻人新電影流出
- 世界實時:百度CEO李彥宏:文心一言大模型將帶來三大產業機會
- 天天新資訊:Apollo將以81億美元價格收購Univar
- 國際金價短線或回落至1905美元附近
- iphone12怎么看黑名單來電?iphone12的像素是多少?
- 蘋果12雙擊截屏怎么設置?蘋果12截屏怎么設置敲兩下?
- 一加8t屏幕刷新率多少?一加8t的充電器可以給蘋果快充嗎?
- iphone12怎么關閉自拍鏡像?iphone12的像素是多少?
- 小米air2怎么取消單耳模式?小米air2怎么進入配對模式?
- iphone12怎么設置天氣小組件?iphone12天氣預報不顯示怎么回事?
- iphone12沒有指紋解鎖嗎?iphone12指紋識別在哪里?
- vivox27充電提示音怎么設置?vivox27充電充不進去怎么辦?
- 榮耀30pro+主攝有光學防抖嗎?榮耀30pro支持無線充電嗎?
- oppo軟件自動更新怎么關閉?oppo軟件隱藏了怎么恢復到桌面?
- 中經評論:制止餐飲浪費 “小份菜”有“大格局”
- iphone11怎么設置微信鈴聲?iphone11微信鈴聲怎么設置在哪里?
- 紅米k30至尊紀念版dc調光怎么開?紅米k30至尊紀念版nfc在什么位置?
- 【環球報資訊】充電更快、更高效!全新鋰金屬電池充滿電僅需一杯咖啡時間
- 創業營收千萬大學生今年已成立3家公司 盤點創業營收千萬大學生關聯公司
- 每日快訊!2月70城房價出爐!55城新房價格環比上漲
- 小米10門禁卡怎么在手機里面使用?小米10門禁卡怎么復制到手機?
- 世界觀熱點:“藍蛙”涉事門店停業整頓被立案調查
- 天天通訊!福建老區縣引來“金鳳凰” 保用電助項目建設
- 小米手機字體大小設置在哪?小米手機一直重啟循環怎么回事?
- 蘋果12怎么調出懸浮球?蘋果懸浮球怎么設置返回?
- 【全球獨家】Bundle x Joy獲得100萬美元戰略投資
- 【環球新視野】OpenAI評估GPT-4是否存在控制人類世界風險
- 2月中國70城新房價格:55城環比上漲 一二三線齊漲
- iphone12promax電池容量多大?iphone12promax是雙卡雙待嗎?
- 湖南法院裁定玖富系信息中介 駁回出借人訴訟平臺請求
- 紅米k30虛擬按鍵怎么設置?紅米k30的屏幕是什么屏?
- Ibanera獲得1850萬美元戰略投資
- 環球熱點評!Broom獲得1000萬美元Pre-A輪融資
- 紅米k30微信視頻怎么美顏?紅米K30微信視頻麥克風在哪里?
- iphone12來電彈窗怎么關閉?iphone12的5g開關在哪里?
- 蘋果12來電閃光燈怎么設置?蘋果12閃光燈上面的孔是干嘛的?
- 蘋果12怎么拍正方形照片?蘋果12照片九宮格怎么設置?
- iPhone12是否支持息屏顯示?iphone12屏幕發黃怎么調白?
- iphone12pro電池容量多大?iphone12pro的運行內存是多少?
- iphone12pro如何裝雙卡?iphone12pro的屏幕是什么材質?
- 蘋果12pro有沒有指紋解鎖?蘋果12pro的運行內存是多少?
- 蘋果12pro怎么打開手電筒?蘋果12pro的電池容量是多少?
- 蘋果12pro怎么開啟靜音模式?蘋果12pro的卡槽在哪里?
- 蘋果12pro怎么設置雙擊截屏?蘋果12pro的nfc在哪個位置?
- 蘋果手機音頻視覺設置在哪里?蘋果手機音頻壞了怎么修復?
- 蘋果11可以插兩張電信卡嗎?蘋果11的電池容量是多少?
- 紅米手機hd在哪關閉?紅米手機丟了怎么定位追蹤?
- vivo手機能微信視頻美顏嗎?vivo手機視頻刪除了怎么恢復?
- ipad浮動鍵盤怎么關閉?ipad浮動鍵盤怎么調回去?
- 小米10照片水印怎么去掉?小米10的音質怎么樣?
- oppoa32返回鍵在哪里設置?oppoa32手機密碼忘了怎么解鎖?
- 環球精選!穆迪:市場存在太多不確定性,美聯儲下周不會加息
- oppo怎么召喚語音助手?oppo語音助手怎么一喊就出來?
- 熱點在線丨摩根大通:重申遠東宏信(03360)“增持”評級 目標價下調至11港元
- 榮耀9x不支持語音喚醒嗎?榮耀9x的語音助手怎么喚醒?
- 蘋果12pro怎么設置小圓點?蘋果12的原點在哪里設置關閉?
- 08月13日臨汾前往青島出行防疫政策查詢-從臨汾出發到青島的防疫政策
- oppoa91錄屏沒有聲音在哪里設置?oppoa91的電池容量是多少?
- 榮耀手機返回鍵怎么調出來?榮耀手機密碼忘了怎么開鎖?
- 蘋果12promax有幾個顏色?蘋果12promax電池更換多少錢?
- 蘋果11沒有正方形拍照嗎?蘋果11的小圓點在哪里設置?
- vivo手機nfc怎么復制門禁卡?vivo手機nfc功能怎么開啟?
- iphone12有沒有指紋解鎖?iphone12面部解鎖失靈怎么辦?
- vivos7怎么前后一起拍?vivos7怎么恢復出廠設置?
- iphone12怎么設置電池百分比?iphone12怎么恢復出廠設置?
- 多方搶注315商標 中消協已成功注冊315商標
- 蘋果12pro怎么設置抬起喚醒?蘋果12pro怎么看國行還是美版?
- miui12地球超級壁紙怎么設置?miui12的文件管理在哪里?
- 紅米k30有沒有無線充電功能?紅米k30的充電器是多少瓦?
- 小米手機關機鬧鐘會響嗎?小米手機鬧鐘不關會一直響嗎?
- 全球新動態:歐洲銀行股暴跌,歐銀大幅加息預期快速降溫!瑞信大舉借款自救,能否避免倒閉有待觀察
- ChatGPT更聰明了!OpenAI推出GPT-4大型語言模型:在諸多測試中表現比人類都好
- 熱頭條丨高盛上調中國2023年GDP增速預測至6%
- 今日訊!微軟確認 不參加2023E3
- 盤點湊湊火鍋商業版圖 湊湊火鍋及母公司呷哺呷哺曾多次被罰
- 天天觀速訊丨男宿管人員每天三次突擊性檢查女寢?錦州師范高等專科學校發布情況說明
- 【時快訊】關曉彤訴多名被告侵權索賠202萬
- 榮耀與螞蟻集團達成戰略合作,涉數字化經營、支付創新等領域
- 料中小銀行面臨沖擊,高盛下調美國2023年GDP預期
- 熱資訊!望知悉和請知悉有什么區別_望周知和請知悉有何區別
- 【天天聚看點】疑似黑鯊6原型機曝光 攝像頭模組帶有軌道設計圖案
- 世界速訊:Zara母公司2022財年銷售額同比增長17%
- 硅谷銀行短暫重開,儲戶搬椅子排長隊取款,不少初創企業面臨倒閉
- 螞蟻集團與榮耀成立終端聯合創新實驗室?探索未來支付形態
- 環球動態:車市價格戰愈演愈烈 吉利、北京汽車“參戰”
- 警報!美國經濟現衰退前兆?美債收益率全線跌破利率區間上限
- 生成式 AI 并非靈丹妙藥 面臨與廣義人工智能相同的挑戰
- 環球今熱點:兩家沙特航司擬引進120架波音787夢想飛機
- 世界觀察:中國科研團隊量化全球火災碳排放對大氣二氧化碳濃度影響
- 天天亮點!蘋果iOS16.4Beta4發布 距離上次更新發布僅隔8天
- 黃金市場分析:若意外失守55日均線,則削弱后市看漲信號
- 3月16日匯市觀潮:歐元、英鎊和日元技術分析
- 【環球新要聞】氫能大飛機,完成首飛 | 最前線
- 世界資訊:高標準農田建設豈容偷工減料 “非標”水泥管被大量違規使用
- 今頭條!SensorTower:《Roblox》位列2月全球移動游戲下載榜榜首
- 全球滾動:今日申購:聯合水務
- 每日報道:美圖公司跌近10% 昨日表示在硅谷銀行沒有賬戶
- 天天日報丨福日電子等投資成立電子科技公司 注冊資本1000萬
- 美國硅谷銀行倒閉,國內醫藥企業受何影響?
- 【熱聞】醫美行業亂象叢生 不可注射美容針被“扎”至人臉
- 世界觀熱點:堵住高標準農田使用“非標”材料漏洞 農業農村部派出工作組督導整改
- 全球微資訊!預計今年手機相機模組出貨量將同比增長 3.6% 達到 46.2 億顆
- 環球速訊:美股道指跌0.87% 花旗大摩埃克森美孚跌約5%
- 清潔度三度一般需要治療多久_清潔度三度怎么降下來
- 環球熱文:警惕假冒合格境外投資者
- 天天通訊!硅谷銀行債權人團體希望該公司申請破產