精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

線程池遇到父子任務,有大坑,要注意!

開發 前端
在實際業務場景下,涉及到業務代碼和不同的微服務,導致問題有點難以定位,但是最終分析出原因之后,發現可以用一個很簡單的例子來演示。所以歪師傅這次先用 Demo 說問題,再說場景,方便吸收。

你好呀,我是歪歪。

最近在使用線程池的時候踩了一個坑,給你分享一下。

在實際業務場景下,涉及到業務代碼和不同的微服務,導致問題有點難以定位,但是最終分析出原因之后,發現可以用一個很簡單的例子來演示。

所以歪師傅這次先用 Demo 說問題,再說場景,方便吸收。

Demo

老規矩,還是先上個代碼:

圖片圖片

這個代碼的邏輯非常簡單,首先我們搞了一個線程池,然后起一個 for 循環往線程池里面仍了 5 個任務,這是核心邏輯。

對于這幾個任務,我們的這個自定義線程池處理起來,不能說得心應手吧,至少也是手拿把掐。

其他的 StopWatch 是為了統計運行時間用的。至于 CountDownLatch,你可以理解為在業務流程中,需要這五個任務都執行完成之后才能往下走,所以我搞了一個 CountDownLatch。

這個代碼運行起來是沒有任何問題的,我們在日志中搜索“執行完成”,也能搜到 5 個,這個結果也能證明程序是正常結束的:

圖片圖片

同時,可以看到運行時間是 4s。

示意圖大概是這樣的:

圖片圖片

然后歪師傅看著這個代碼,發現了一個可以優化的地方:

圖片圖片

這個地方從數據庫撈出來的數據,它們之間是沒有依賴關系的,也就是說它們之間也是可以并行執行的。

所以歪師傅把代碼改成了這樣:

圖片圖片

在異步線程里面去處理這部分從數據庫中撈出來的數據,并行處理加快響應速度。

對應到圖片,大概就是這個意思:

圖片圖片

把程序運行起來之后,日志變成了這樣:

圖片圖片

我們搜索“執行完成”,也能搜到 5 個對應輸出。

而且我們就拿“任務2”來說:

圖片圖片

當前線程pool-1-thread-3,---【任務2】開始執行---
當前線程pool-1-thread-3,---【任務2】執行完成---
當前線程pool-1-thread-1,【任務2】開始處理數據=1
當前線程pool-1-thread-2,【任務2】開始處理數據=2

從日志輸出來看,任務 2 需要處理的兩個數據,確實是在不同的異步線程中處理數據,也實現了我的需求。

但是,程序運行直接就是到了 9.9ms:

圖片圖片

這個優化這么牛逼的嗎?

從 4s 到了 9.9ms?

稍加分析,你會發現這里面是有問題的。

那么問題就來了,到底是啥問題呢?

你也分析分析大概是啥問題,別老是想著直接找答案啊。

問題就是由于轉異步了,所以 for 循環里面的任務中的 countDownLatch 很快就減到 0 了。

于是 await 繼續執行,所以很快就輸出了程序運行時間。

然而實際上子任務還在繼續執行,程序并沒有真正完成。

9.9ms 只是任務提交到線程池的時間,每個任務的數據處理時間還沒算呢:

圖片圖片

從日志輸出上也可以看出,在輸出了 StopWatch 的日志后,各個任務還在處理數據。

這樣時間就顯得不夠真實。

那么我們應該怎么辦呢?

很簡單嘛,需要子任務真正執行完成后,父任務的 countDownLatch 才能進行 countDown 的動作。

具體實現上就是給子任務再加一個 countDownLatch 柵欄:

圖片圖片

我們希望的運行結果應該是這樣的:

當前線程pool-1-thread-3,---【任務2】開始執行---
當前線程pool-1-thread-1,【任務2】開始處理數據=1
當前線程pool-1-thread-2,【任務2】開始處理數據=2
當前線程pool-1-thread-3,---【任務2】執行完成---

即子任務全部完成之后,父任務才能算執行完成,這樣統計出來的時間才是準確的。

思路清晰,非常完美,再次運行,觀察日志我們會發現:

圖片圖片

呃,怎么回事,日志怎么不輸出了?

是的,就是不輸出了。

不輸出了,就是踩到這個坑了。

不論你重啟多少次,都是這樣:日志不輸出了,程序就像是卡著了一樣。

坑在哪兒

上面這個 Demo 已經是我基于遇到的生產問題,極力簡化后的版本了。

現在,這個坑也已經呈現在你眼前了。

我們一起來分析一波。

首先,我問你:真的在線上遇到這種程序“假死”的問題,你會怎么辦?

早幾年,歪師傅的習慣是抱著代碼慢慢啃,試圖從代碼中找到端倪。

這樣確實是可以,但是通常來說效率不高。

現在我的習慣是直接把現場 dump 下來,分析現場。

比如在這個場景下,我們直觀上的感受是“卡住了”,那就 dump 一把線程,管它有棗沒棗,打一桿子再說:

圖片圖片

通過 Dump 文件,可以發現線程池的線程都在 MainTest 的第 30 行上 parking ,處于等待狀態:

圖片圖片

那么第 30 行是啥玩意?

圖片圖片

這行代碼在干啥?

countDownLatchSub.await();

是父任務在等待子任務執行結束,運行 finally 代碼,把 countDownLatchSub 的計數 countDown 到 0,才會繼續執行:

圖片圖片

所以現在的現象就是子任務的 countDownLatchSub 把父任務的攔住了。

換句話說就是父任務被攔住是因為子任務的 finally 代碼中的 countDownLatchSub.countDown() 方法沒有被執行。

好,那么最關鍵的問題就來了:為什么沒有執行?

你先別往下看,閉上眼睛在你的小腦瓜子里面推演一下,琢磨一下:finally 為什么沒有執行?

或者再換個更加接近真實的問題:子任務為什么沒有執行?

這個點,非常簡單,可以說一點就破。

琢磨明白了,這個坑的原理摸摸清楚了。

...

...

...

琢磨明白了嗎?你就刷刷往下看?

沒明白我再給你一個信息:需要結合線程池的參數和運行原理來分析。

什么?

你說線程池的運行原理你不清楚?

請你取關好嗎,你個假粉絲。

...

...

...

好,不管你“恍然大悟”了沒有,歪師傅給你講一下。

讓你知道“一點就破”這四個是怎么回事兒。

首先,我們把目光聚焦在線程池這里:

圖片圖片

這個線程池核心線程數是 3,但是我們要提交 5 個任務到線程池去。

父任務哐哐哐,就把核心線程數占滿了。

接下來子任務也要往這個線程池提交任務怎么辦?

當然是進隊列等著了。

一進隊列,就完犢子。

到這里,我覺得你應該能想明白問題了。

應該給到我一個恍然大悟的表情,并配上“哦哦哦~”這樣的內心 OS。

你想想,父任務這個時候干啥?

是不是等在 countDownLatchSub.await() 這里。

而 countDownLatchSub.await() 什么時候能繼續執行?

是不是要所有子任務都執行 finally 后?

那么子任務現在在干啥?

是不是都在線程池里面的隊列等著被執行呢?

那線程池隊列里面的任務什么時候才執行?

是不是等著有空閑線程的時候?

那現在有沒有空閑線程?

沒有,所有的線程都去執行父任務去了。

那你想想,父任務這個時候干啥?

是不是等在 countDownLatchSub.await() 這里。

...

父任務在等子任務執行。

子任務在等線程池調度。

線程池在等父任務釋放線程。

閉環了,相互等待了,家人們。

這,就是坑。

現在把坑的原理摸清楚了,我在給你說一下真實的線上場景踩到這個坑是怎么樣的呢?

圖片圖片

上游發起請求到微服務 A 的接口 1,該接口需要調用微服務 B 的接口 2。

但是微服務 B 的接口 2,需要從微服務 A 接口 3 獲取數據。

然而在微服務 A 內部,全局使用的是同一個自定義線程池。

更巧的是接口 1 和接口 3 內部都使用了這個自定義線程池做異步并行處理,想著是加快響應速度。

整個情況就變成了這樣:

  1. 接口 1 收到請求之后,把請求轉到自定義線程池中,然后等接口 2 返回。
  2. 接口 2 調用接口 3,并等待返回。
  3. 接口 3 里面把請求轉到了自定義線程池中,被放入了隊列。
  4. 線程池的線程都被接口 1 給占住了,沒有資源去執行隊列里面的接口 3 任務。
  5. 相互等待,一直僵持。

我們的 Demo 還是能比較清晰的看到父子任務之間的關系。

但是在這個微服務的場景下,在無形之間,就形成了不易察覺的父子任務關系。

所以就踩到了這個坑。

怎么避免

找到了坑的原因,解決方案就隨之而出了。

父子任務不要共用一個線程池,給子任務也搞一個自定義線程池就可以了:

圖片圖片

運行起來看看日志:

圖片圖片

首先整體運行時間只需要 2s 了,達到了我想要的效果。

另外,我們觀察一個具體的任務:

當前線程pool-1-thread-3,---【任務2】開始執行---
當前線程pool-2-thread-1,【任務2】開始處理數據=1
當前線程pool-2-thread-4,【任務2】開始處理數據=2
當前線程pool-1-thread-3,---【任務2】執行完成---

日志輸出符合我們前面分析的,所有子任務執行完成后,父任務才打印執行完成,且子任務在不同的線程中執行。

而使用不同的線程池,換一個高大上的說法就叫做:線程池隔離。

而且在一個項目中,公用一個線程池,也是一個埋坑的邏輯。

至少給你覺得關鍵的邏輯,單獨分配一個線程池吧。

避免出現線程池的線程都在執行非核心邏輯了,反而重要的任務在隊列里面排隊去了。

這就有點不合理了。

最后,一句話總結這個問題:

如果線程池的任務之間存在父子關系,那么請不要使用同一個線程池。如果使用了同一個線程池,可能會因為子任務進了隊列,導致父任務一直等待,出現假死現象。

責任編輯:武曉燕 來源: why技術
相關推薦

2020-04-24 20:05:16

VueAxios前端

2025-04-16 02:20:00

2010-03-16 16:34:06

Java編程語言

2024-07-15 08:20:24

2024-09-13 09:06:22

2010-04-21 10:04:33

Oracle移植

2016-02-01 16:04:45

開源創業關鍵點

2018-03-16 17:25:22

存儲

2023-08-04 11:04:03

線程池項目開發

2024-09-09 15:09:30

2020-09-28 11:14:57

線程數據語言

2022-03-28 08:31:29

線程池定時任務

2024-02-28 09:54:07

線程池配置

2025-02-04 11:45:23

2023-12-29 09:38:00

Java線程池

2015-10-12 11:26:12

iOS 9適配

2021-12-30 06:59:28

方法重寫面試

2010-07-20 15:00:06

網上購物信息安全360安全中心

2011-05-26 17:37:11

Ajax

2023-07-05 07:48:04

線程池join關閉狀態
點贊
收藏

51CTO技術棧公眾號

久久精品91久久香蕉加勒比| 午夜精品免费在线观看| 成人性生交xxxxx网站| 免费在线观看国产精品| 久久综合另类图片小说| 色综合中文字幕| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 999久久久久| 国产亚洲综合精品| www.欧美精品| 久久人人妻人人人人妻性色av| 播放一区二区| 亚洲.国产.中文慕字在线| 日韩欧美亚洲日产国| 国产婷婷在线视频| 青青草97国产精品免费观看| 欧美日韩成人精品| 国产精品美女高潮无套| 91在线一区| 欧美日韩国产一二三| 亚洲熟妇av日韩熟妇在线 | 亚洲第一男人av| 国产视频1区2区3区| 欧美aa在线| 亚洲欧美乱综合| 日本一区视频在线播放| 国产黄色av网站| 欧美a级理论片| 亚洲91精品在线| 国产精品丝袜一区二区| 精品国产精品久久一区免费式| 日韩免费在线观看| 思思久久精品视频| 456亚洲精品成人影院| 亚洲国产精品天堂| 男插女免费视频| 国产主播福利在线| 99久久综合精品| 成人自拍爱视频| 国产美女免费视频| 精品一区二区三区欧美| 国产精品美女久久| 久久久久久无码精品大片| 日韩亚洲国产精品| 久久久久久久久电影| 99自拍视频在线| 久久高清免费| 色综合影院在线| 日韩影视一区二区三区| 国产一区2区| 亚洲欧洲在线免费| 老鸭窝一区二区| www.豆豆成人网.com| 欧美变态凌虐bdsm| 欧洲成人午夜精品无码区久久| 国产aⅴ精品一区二区四区| 欧美日韩精品系列| 久久国产激情视频| 欧美xxxx网站| 制服丝袜中文字幕亚洲| 污视频网址在线观看| 青娱乐极品盛宴一区二区| 欧美视频一区在线观看| 视频在线观看免费高清| 人人玩人人添人人澡欧美| 777色狠狠一区二区三区| 亚洲免费成人在线视频| 国产精品一区二区三区四区在线观看| 欧美一区二区三区日韩视频| 佐山爱在线视频| 综合成人在线| 亚洲精品乱码久久久久久按摩观| 亚洲最大免费视频| 国产精品一区二区三区av麻| 永久免费精品影视网站| 熟女少妇a性色生活片毛片| 91成人免费| 欧美区二区三区| 日韩视频免费观看高清| 久久免费高清| 国产日韩在线看片| 亚洲高清精品视频| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美极品日韩| 日日夜夜精品一区| 亚洲国产精品自拍| 成人在线观看a| 国产麻豆一区二区三区| 亚洲精品一区在线观看| 一道本在线观看| 亚洲成人国产| 17婷婷久久www| 中日韩在线观看视频| 国产一区二区三区四区五区美女 | 国产一区二区三区四区视频| 国产一区高清在线| 精品高清视频| 精品51国产黑色丝袜高跟鞋| 午夜精品爽啪视频| 天天综合天天添夜夜添狠狠添| 一区二区亚洲视频| 亚洲天堂网在线观看| 五月婷婷一区二区| 玖玖国产精品视频| 成人午夜电影在线播放| h视频在线播放| 亚洲国产乱码最新视频| 青青草久久伊人| 精品在线网站观看| www.日韩欧美| 久久久黄色大片| 国产91高潮流白浆在线麻豆| 日韩精品极品视频在线观看免费| a级网站在线播放| 欧美自拍偷拍一区| 国产chinese中国hdxxxx| 欧美hd在线| 日本成人精品在线| 日韩在线视频免费| 亚洲久草在线视频| 亚洲国产成人va在线观看麻豆| 日韩极品在线| 欧美第一淫aaasss性| 中文字幕在线网址| 久久久精品欧美丰满| 九九爱精品视频| 久久伊人久久| 久久九九国产精品怡红院| 欧美男人亚洲天堂| 99精品国产99久久久久久白柏| 美女黄色片网站| 久久精品嫩草影院| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 女人裸体性做爰全过| 麻豆亚洲精品| 久久99精品久久久久子伦| 呦呦在线视频| 欧美一二三四区在线| 日本 欧美 国产| 老司机精品视频一区二区三区| 欧美在线3区| 波多野结衣久久精品| 亚洲电影免费观看高清完整版在线观看 | 18国产免费视频| 久久九九久久九九| 久章草在线视频| 亚洲国产网址| 欧美一区二区影院| 头脑特工队2在线播放| 亚洲精品国久久99热| 日韩va在线观看| 一区二区国产在线| 亚洲影院色无极综合| 2024最新电影免费在线观看| 欧美一区二区美女| 久久午夜无码鲁丝片午夜精品| 国产精品自产自拍| 亚洲色欲久久久综合网东京热| 激情不卡一区二区三区视频在线| 精品国偷自产在线视频99| 国产又粗又长又大视频| 亚洲女同一区二区| 久久久久亚洲av成人网人人软件| 精品91久久久久| 精品久久久久久中文字幕动漫 | 国产日韩中文字幕| 成人免费网站在线观看视频| 欧美一级一区二区| 精品处破女学生| 99精品国产91久久久久久| 天天碰免费视频| 91久久国产| 成人h视频在线观看| av影片在线| 亚洲第一区在线| 国产又粗又猛又黄视频| 国产精品伦一区| 91porn在线| 亚洲在线一区| 杨幂一区欧美专区| 成人搞黄视频| 国产精品免费一区豆花| a级网站在线播放| 精品亚洲男同gayvideo网站 | 欧美xxxx性xxxxx高清| 日韩电影大片中文字幕| 在线免费观看高清视频| 亚洲自拍偷拍欧美| 香蕉视频久久久| 国产毛片精品视频| 中国丰满人妻videoshd| 日韩一区二区中文| 国产精品露出视频| av一区在线播放| 欧美激情一级二级| aⅴ在线视频男人的天堂| 日韩精品中午字幕| 无码人妻一区二区三区线| 日韩一区有码在线| 国产人妻人伦精品1国产丝袜| 麻豆极品一区二区三区| 精品无码一区二区三区在线| 欧美3p在线观看| 蜜桃视频在线观看成人| 欧美日韩黄网站| 国产精品第一视频| 不卡av免费观看| 久久精品视频中文字幕| 日本在线一二三| 日韩欧美的一区二区| 懂色av蜜臀av粉嫩av喷吹| 亚洲福利视频三区| 人人澡人人澡人人看| 久久久不卡网国产精品二区| 亚洲美女精品视频| 久久99国产精品免费| 欧美黄色一级片视频| 亚洲国产mv| 影音先锋成人资源网站| 欧美理论视频| 欧美精品一区在线| 国产厕拍一区| 99在线视频首页| 中文字幕日韩亚洲| 国产精品久久久久久超碰| 蜜桃视频在线观看播放| 欧美猛少妇色xxxxx| 女女色综合影院| 中国人与牲禽动交精品| 欧美色视频免费| 亚洲激情自拍图| 亚洲高清在线观看视频| 日韩一区二区在线看| 国产一区二区在线视频观看| 欧美在线色视频| 神马久久久久久久| 日韩欧美成人精品| 亚洲欧美综合自拍| 欧美日韩精品国产| 日韩三级视频在线| 婷婷成人综合网| 日韩 欧美 精品| 亚洲狠狠爱一区二区三区| 久久精品www人人爽人人| 亚洲精品第一国产综合野| 欧美精品久久久久久久久46p| 中文字幕一区二区5566日韩| 91导航在线观看| 国产精品欧美极品| 日韩免费成人av| 欧美激情在线看| 91资源在线播放| 中文字幕在线观看不卡视频| 国产日产在线观看| 亚洲色图欧美在线| 亚洲av鲁丝一区二区三区| 亚洲精品国产第一综合99久久| 日本老熟俱乐部h0930| 亚洲精品乱码久久久久久| 激情五月少妇a| 亚洲国产综合色| 天天插天天操天天干| 欧美视频免费在线| 91在线视频免费播放| 欧美色视频在线| 亚洲一线在线观看| 日韩网站在线看片你懂的| 亚洲男人第一天堂| 亚洲精品自拍偷拍| 国产三级视频在线| 久久精品国产91精品亚洲| av网站网址在线观看| 欧美激情在线播放| 伊人久久综合一区二区| 国产精品视频地址| 久久精品九色| 久久久久久99| 日韩国产专区| 成人av在线播放观看| 先锋亚洲精品| 中文字幕丰满乱码| 成人精品视频一区二区三区尤物| 久久国产精品影院| 亚洲欧洲成人自拍| 日韩免费不卡视频| 在线免费观看视频一区| av中文字幕免费| 亚洲片在线资源| 爆操欧美美女| 日本欧美中文字幕| 日韩在线观看中文字幕| 九色91在线视频| 久久久久蜜桃| 男人天堂999| 国内精品自线一区二区三区视频| jjzzjjzz欧美69巨大| 国产精品久久久久婷婷二区次| 久久久久久欧美精品se一二三四| 色悠久久久久综合欧美99| 国产情侣激情自拍| 亚洲欧美精品伊人久久| 性xxxfreexxxx性欧美| 日本久久久久久久| 在线综合色站| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 极品日韩av| 五月天开心婷婷| 久久一区二区三区国产精品| 91aaa在线观看| 欧美三级在线视频| 视频二区在线| 色综合视频网站| 亚洲一区av| 欧美日韩另类综合| 亚洲国产激情| 欧美人与性动交α欧美精品| 日本一区二区动态图| 成人免费视频毛片| 精品日韩一区二区| 精品孕妇一区二区三区| 国产精品第三页| 亚瑟一区二区三区四区| 久久久久99精品成人片| 狠狠色丁香婷综合久久| 极品尤物一区二区| 一本久道久久综合中文字幕| 成人乱码一区二区三区| 久久成年人视频| 91麻豆精品国产综合久久久 | 日韩极品在线| 成人免费视频91| 国产伦精品一区二区三区免费| 久久日免费视频| 在线精品视频免费播放| 欧美日韩在线中文字幕| 欧美性在线视频| 欧美日日夜夜| 成年人网站免费视频| 成人性生交大片免费看中文网站| 99视频只有精品| 欧美一区中文字幕| 麻豆网站在线| 91嫩草在线视频| 最新国产精品| 99中文字幕在线| 亚洲激情第一区| 国产丰满美女做爰| 欧美肥老妇视频| 岛国精品一区| 97国产精东麻豆人妻电影 | 超碰国产一区| 日韩欧美视频一区二区三区四区| 日韩国产精品久久久久久亚洲| 精品无人区无码乱码毛片国产| 色综合久久99| 午夜在线免费观看视频| 成人在线小视频| 好吊一区二区三区| 少妇一级淫免费观看| 狠狠久久五月精品中文字幕| 九色蝌蚪在线| 91精品国产综合久久香蕉| 久久精品久久久| 黄色国产在线视频| 欧美日韩中文字幕日韩欧美| 国产免费视频在线| 91网在线免费观看| 欧美日韩国内| 欧美一区二区三区成人精品| 欧美亚洲国产一区在线观看网站| 欧美高清视频| 国产乱人伦精品一区二区| 香蕉精品999视频一区二区| 美女100%露胸无遮挡| 日韩一区二区三区在线视频| 黄视频网站在线观看| 亚洲狠狠婷婷综合久久久| 国产a视频精品免费观看| 欧美一区二区三区不卡视频| 日韩中文字幕在线观看| 久久午夜影院| 黄大色黄女片18第一次| 亚洲一区二区视频| 番号在线播放| 成人av播放| 蜜桃精品在线观看| 日本免费在线播放| 色多多国产成人永久免费网站 | 亚洲精品国产一区| 成人在线一区二区三区| 久久久久久久久久一级| 欧美日韩电影在线观看| 精品国产一区二区三区噜噜噜| 国产在线a视频| 欧美亚洲一区二区在线观看| heyzo高清国产精品| 亚洲一卡二卡| 91在线看国产| 精品久久久久久亚洲综合网站| 青草成人免费视频|