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

記一次線程池引發(fā)的故障 排查下來是誰的鍋

網(wǎng)絡(luò) 通信技術(shù)
敖丙之前在工作中遇到一個問題,我定義了一個線程池來執(zhí)行任務(wù),但是程序執(zhí)行結(jié)束后任務(wù)沒有全部執(zhí)行完,當時心態(tài)就差點崩了。

本文轉(zhuǎn)載自微信公眾號「 三太子敖丙」,轉(zhuǎn)載本文請聯(lián)系 三太子敖丙公眾號。

[[329971]]

 背景

敖丙之前在工作中遇到一個問題,我定義了一個線程池來執(zhí)行任務(wù),但是程序執(zhí)行結(jié)束后任務(wù)沒有全部執(zhí)行完,當時心態(tài)就差點崩了。

 

業(yè)務(wù)場景是這樣的:由于統(tǒng)計業(yè)務(wù)需要,訂單信息需要從主庫中經(jīng)過統(tǒng)計業(yè)務(wù)代碼寫入統(tǒng)計庫(中間需要邏輯處理所以不能走binlog)。

由于代碼質(zhì)量及歷史原因,目前的重新統(tǒng)計接口是單線程的,粗略算了算一共有100萬條訂單信息,每100條的處理大約是10秒,所以理論上處理完全部信息需要28個小時,這還不算因為 mysql 中 limit 分頁導(dǎo)致的后期查詢時間以及可能出現(xiàn)的內(nèi)存溢出導(dǎo)致中止統(tǒng)計的情況。

基于上述的原因,以及最重要的一點:統(tǒng)計業(yè)務(wù)是根據(jù)訂單所屬的中心進行的,各個中心同時統(tǒng)計不會導(dǎo)致臟數(shù)據(jù)。

所以,我計劃使用線程池,為每一個中心分配一條線程去執(zhí)行統(tǒng)計業(yè)務(wù)。

業(yè)務(wù)實現(xiàn)

  1. // 線程工廠,用于為線程池中的每條線程命名 
  2. ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("stats-pool-%d").build(); 
  3.  
  4. // 創(chuàng)建線程池,使用有界阻塞隊列防止內(nèi)存溢出 
  5. ExecutorService statsThreadPool = new ThreadPoolExecutor(5, 10, 
  6.                 0L, TimeUnit.MILLISECONDS, 
  7.                 new LinkedBlockingQueue<>(100), namedThreadFactory); 
  8. // 遍歷所有中心,為每一個centerId提交一條任務(wù)到線程池 
  9. statsThreadPool.submit(new StatsJob(centerId)); 

在創(chuàng)建完線程池后,為每一個 centerId 提交一條任務(wù)到線程池,在我的預(yù)想中,由于線程池的核心線程數(shù)為5,最多5個中心同時進行統(tǒng)計業(yè)務(wù),將大大縮短100萬條數(shù)據(jù)的總統(tǒng)計時間,于是萬分興奮的我開始執(zhí)行重新統(tǒng)計業(yè)務(wù)了。

問題

在跑了很久之后,當我查看統(tǒng)計進度時,我發(fā)現(xiàn)了一個十分詭異的問題(如下圖)。

藍框標出的這條線程是 WAIT 狀態(tài),表明這條線程是空閑狀態(tài),但是從日志中我看到這條線程并沒有完成它的任務(wù),因為這個中心的數(shù)據(jù)有10萬條,但是日志顯示它只跑到了一半,之后就再無關(guān)于此中心的日志了。

 

記一次線程池故障,害阿里程序員差點被開除

 

這是什么原因?

我當場就想到了三歪,肯定是三歪今天早上上班左腳先邁進公司的,導(dǎo)致代碼水土不服,一定是這樣,我去找他去。

 

調(diào)試及原因

咳咳三歪是開玩笑的,我們還是需要找到真實原因。

可以想到的是,這條線程因為某些原因被阻塞了,并且沒有繼續(xù)進行下去,但是日志又沒有任何異常信息…

可能有經(jīng)驗的工程師已經(jīng)知道了原因…

由于個人水平的線程,暫時沒有找到原因的我只能放棄使用線程池,乖乖用單線程跑…

幸運的是,單線程跑的任務(wù)竟然拋錯了(為什么要說幸運?),于是馬上想到,之前那條 WAIT 狀態(tài)的線程可能是因為同樣的拋錯所以被中斷了,導(dǎo)致任務(wù)沒有繼續(xù)進行下去。

為什么說幸運?因為如果單線程的任務(wù)沒有拋錯的話,我可能很久都想不到是這個原因。

 

深入探究線程池的異常處理

工作上的問題到這里就找到原因了,之后的解決過程也十分簡單,這里就不提了。

但是疑問又來了,為什么使用線程池的時候,線程因異常被中斷卻沒有拋出任何信息呢?還有平時如果是在 main 函數(shù)里面的異常也會被拋出來,而不是像線程池這樣被吞掉。

如果子線程拋出了異常,線程池會如何進行處理呢?

我提交任務(wù)到線程池的方式是: threadPoolExecutor.submit(Runnbale task); ,后面了解到使用 execute() 方式提交任務(wù)會把異常日志給打出來,這里研究一下為什么使用 submit 提交任務(wù),在任務(wù)中的異常會被“吞掉”。

對于 submit() 形式提交的任務(wù),我們直接看源碼:

  1. public Future<?> submit(Runnable task) { 
  2.     if (task == null) throw new NullPointerException(); 
  3.     // 被包裝成 RunnableFuture 對象,然后準備添加到工作隊列 
  4.     RunnableFuture<Void> ftask = newTaskFor(task, null); 
  5.     execute(ftask); 
  6.     return ftask; 

它會被線程池包裝成 RunnableFuture 對象,而最終它其實是一個 FutureTask 對象,在被添加到線程池的工作隊列,然后調(diào)用 start() 方法后, FutureTask 對象的 run() 方法開始運行,即本任務(wù)開始執(zhí)行。

  1. public void run() { 
  2.     if (state != NEW || !UNSAFE.compareAndSwapObject(this,runnerOffset,null, Thread.currentThread())) 
  3.         return
  4.     try { 
  5.         Callable<V> c = callable; 
  6.         if (c != null && state == NEW) { 
  7.             V result; 
  8.             boolean ran; 
  9.             try { 
  10.                 result = c.call(); 
  11.                 ran = true
  12.             } catch (Throwable ex) { 
  13.                 // 捕獲子任務(wù)中的異常 
  14.                 result = null
  15.                 ran = false
  16.                 setException(ex); 
  17.             } 
  18.             if (ran) 
  19.                 set(result); 
  20.         } 
  21.     } finally { 
  22.         runner = null
  23.         int s = state; 
  24.         if (s >= INTERRUPTING) 
  25.             handlePossibleCancellationInterrupt(s); 
  26.     } 

在 FutureTask 對象的 run() 方法中,該任務(wù)拋出的異常被捕獲,然后在setException(ex); 方法中,拋出的異常會被放到 outcome 對象中,這個對象就是 submit() 方法會返回的 FutureTask 對象執(zhí)行 get() 方法得到的結(jié)果。

但是在線程池中,并沒有獲取執(zhí)行子線程的結(jié)果,所以異常也就沒有被拋出來,即被“吞掉”了。

這就是線程池的 submit() 方法提交任務(wù)沒有異常拋出的原因。

線程池自定義異常處理方法

在定義 ThreadFactory 的時候調(diào)用

setUncaughtExceptionHandler方法,自定義異常處理方法。例如:

  1. ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() 
  2.                 .setNameFormat("judge-pool-%d"
  3.                 .setUncaughtExceptionHandler((thread, throwable)-> logger.error("ThreadPool {} got exception", thread,throwable)) 
  4.                 .build(); 

這樣,對于線程池中每條線程拋出的異常都會打下 error 日志,就不會看不到了。

后續(xù)

在修復(fù)了單個線程任務(wù)的異常之后,我繼續(xù)使用線程池進行重新統(tǒng)計業(yè)務(wù),終于跑完了,也終于完成了這個任務(wù)。

事后我也叫三歪以后進公司一定要先邁出右腳進來,不然對寫代碼的風(fēng)水影響很大。

 

小結(jié):丙這個事故也給大家一個警示,使用線程池時需要注意,子線程的異常,如果沒有被捕獲就會丟失,可能會導(dǎo)致后期根據(jù)日志調(diào)試時無法找到原因。

 

責任編輯:武曉燕 來源: 三太子敖丙
相關(guān)推薦

2021-04-13 08:54:28

dubbo線程池事故排查

2022-12-17 19:49:37

GCJVM故障

2019-03-15 16:20:45

MySQL死鎖排查命令

2021-05-13 08:51:20

GC問題排查

2022-11-29 21:26:26

跨域配置

2021-08-20 11:35:04

服務(wù)運維 故障

2023-01-04 18:32:31

線上服務(wù)代碼

2018-08-07 10:54:02

HTTPS郵箱瀏覽器

2023-04-06 07:53:56

Redis連接問題K8s

2021-12-02 07:50:30

NFS故障內(nèi)存

2024-04-10 08:48:31

MySQLSQL語句

2021-11-23 21:21:07

線上排查服務(wù)

2017-12-19 14:00:16

數(shù)據(jù)庫MySQL死鎖排查

2024-06-28 10:01:04

2021-11-01 17:29:02

Windows系統(tǒng)Fork

2022-11-16 08:00:00

雪花算法原理

2021-01-08 13:52:15

Consul微服務(wù)服務(wù)注冊中心

2017-09-01 09:17:51

DNS緩存慘案

2018-07-03 10:49:22

性能故障排查

2021-03-29 12:35:04

Kubernetes環(huán)境TCP
點贊
收藏

51CTO技術(shù)棧公眾號

99reav在线| 日韩精品一区二区不卡| 国产成人免费精品| 国产精品久久精品日日| 99c视频在线| 成年免费在线观看| 色综合久久一区二区三区| 91精品国产福利| 大陆极品少妇内射aaaaa| 国产中文字幕在线播放| 国产精品一区二区在线看| 97精品免费视频| 国产美女高潮视频| 欧美日韩导航| 7777精品伊人久久久大香线蕉超级流畅| www.18av.com| 国产在线三区| 国产最新精品免费| 日韩免费观看网站| 国产一级在线视频| 欧美电影免费| 亚洲欧美中文另类| 中文字幕18页| 欧美日韩卡一| 日韩欧美主播在线| 水蜜桃在线免费观看| 国产日本在线| 99久久精品免费看| 国产激情美女久久久久久吹潮| 免费av中文字幕| 99精品热6080yy久久| 精品国产一区二区三区久久久狼 | 欧美精品色哟哟| 免费毛片在线不卡| 亚洲白拍色综合图区| 天天操夜夜操很很操| 日韩一区精品| 色先锋资源久久综合| 六月婷婷在线视频| a免费在线观看| 国产精品短视频| 日韩欧美视频一区二区三区四区| 四季av日韩精品一区| 国产高清精品久久久久| 91免费在线视频| 一区二区三区精彩视频| 久久国产夜色精品鲁鲁99| 国产精品久久久久久久久久久新郎| 日韩美女一级片| 亚洲特级毛片| 国模精品一区二区三区色天香| 久久久久久久久久久久久久免费看| 亚洲天堂一区二区三区四区| 丝袜一区二区三区| 91精品久久久久久久久久久久| 综合亚洲自拍| 国产视频久久久久久久| 色噜噜在线观看| 一本久久青青| 亚洲网站视频福利| 五月天精品视频| 国产欧美日韩视频在线| 在线色欧美三级视频| 色综合99久久久无码国产精品| 精品亚洲成人| 中文字幕精品av| 午夜国产小视频| 欧美福利电影在线观看| 欧美激情一级二级| 日韩免费黄色片| 免费亚洲视频| 国产精品久久久久久久午夜| 中国老头性行为xxxx| 另类欧美日韩国产在线| 成人在线小视频| 亚洲经典一区二区三区| 99久久99久久免费精品蜜臀| 久久亚洲国产精品日日av夜夜| 男男激情在线| 国产精品看片你懂得| 丰满人妻一区二区三区53号| 国模精品视频| 在线观看视频91| 手机在线免费毛片| 久久午夜影院| 日韩在线中文视频| 国产一级在线视频| 日韩电影在线免费观看| 亚洲一区久久久| 亚洲 欧美 精品| 中文字幕一区在线观看视频| 18黄暴禁片在线观看| 黑人巨大亚洲一区二区久| 欧美日韩免费视频| 国产精品久久久久久久无码| 国产精品一在线观看| 欧美精品制服第一页| 精品欧美一区二区三区免费观看| 奇米精品一区二区三区四区| av一区二区三区四区电影| 免费在线观看一级毛片| 亚洲日本在线看| 国产主播在线看| 久久一级大片| 国产一区二区久久精品| 久久亚洲av午夜福利精品一区| 日韩在线一区二区| 成人免费在线看片| 二区在线观看| 午夜精品爽啪视频| 午夜激情影院在线观看| 亚瑟一区二区三区四区| 欧美成人精品xxx| 国产一区免费看| 成人免费高清视频| 在线成人性视频| 欧美电影免费看| 亚洲国产精品人人爽夜夜爽| 搜索黄色一级片| 久久三级福利| 久久久精彩视频| 色噜噜狠狠狠综合欧洲色8| 日本高清不卡在线观看| 美女露出粉嫩尿囗让男人桶| 国产国产精品| 国产精品视频成人| 欧美捆绑视频| 亚洲福中文字幕伊人影院| 亚洲天堂网站在线| 99久久影视| 国产精品爽黄69| 国产中文字幕在线| 欧美日韩一区二区三区在线免费观看| 波多野结衣中文字幕在线播放| 日韩在线观看一区 | 91成人在线免费| 国产亚洲成年网址在线观看| 日韩精品xxxx| 国产精品超碰| 国内久久久精品| 好吊视频一区二区三区| 亚洲精品一二三| 亚洲视频在线不卡| 久久久久久久久久久久久久| 国产欧美精品久久久| av在线资源网| 欧美性猛交xxxx乱大交退制版| 欧美色图亚洲激情| 国产精品久久久久久久免费软件| 久久99精品久久久久久秒播放器 | 成人h视频在线观看播放| 国产一级免费在线观看| 91国偷自产一区二区开放时间| 37p粉嫩大胆色噜噜噜| 国产精品综合| 免费亚洲精品视频| 欧美xxxx做受欧美护士| 亚洲欧美日韩精品| 日韩国产成人在线| 中文av一区特黄| 天天做天天干天天操| 中文字幕人成人乱码| 成人在线视频电影| av影视在线看| 亚洲美女免费精品视频在线观看| 中文字幕视频网站| 亚洲国产精品传媒在线观看| 国产三级三级看三级| 婷婷精品进入| 国产精品二区在线观看| segui88久久综合9999| 精品调教chinesegay| 日韩精品一区二区亚洲av观看| 亚洲国产精品成人综合色在线婷婷| 色婷婷一区二区三区av免费看| 久久久久av| 国产偷久久久精品专区| 日韩三级影视| 久久九九精品99国产精品| 亚洲精品国产片| 欧美性极品xxxx娇小| 国产精品一区二区亚洲| 国产精品一级在线| 精品少妇一区二区三区在线| 精品一区av| 99久久无色码| 国产超碰精品| 久久不射热爱视频精品| 天天操天天干天天爽| 欧美色视频在线| 欧美日韩一级在线观看| 久久你懂得1024| 午夜不卡福利视频| 性高湖久久久久久久久| 日韩国产精品毛片| 日韩电影在线观看完整免费观看| 国产精品美女视频网站| www在线免费观看视频| 亚洲精品乱码久久久久久金桔影视| 中文字幕码精品视频网站| 一区二区三区欧美激情| 国产传媒国产传媒| 成人av在线观| 亚洲精品性视频| 国产精品日本| 免费看日b视频| 热久久天天拍国产| 国产女人水真多18毛片18精品| 成人免费视频观看| 91精品国产成人| 18av在线播放| 中文字幕亚洲欧美一区二区三区 | 久久福利视频网| 欧美视频综合| 亚洲国产天堂网精品网站| 亚洲综合精品视频| 一本久久精品一区二区| 国产一级中文字幕| 亚洲欧洲中文日韩久久av乱码| 亚洲AV无码国产成人久久| 成人免费毛片高清视频| 三级性生活视频| 奇米四色…亚洲| 日韩精品一区二区三区色欲av| 国内揄拍国内精品久久| 丰满女人性猛交| 日韩专区精品| 日本在线观看一区二区| 色婷婷久久久| 国产综合精品一区二区三区| 一区二区三区四区精品视频| 成人欧美一区二区三区黑人| 成人精品国产亚洲| 国产精品美女免费看| 日韩精品一区二区三区av| 热久久99这里有精品| 中文字幕21页在线看| 69av在线视频| 国产福利电影在线播放| 91高清在线免费观看| 91禁在线看| 538国产精品视频一区二区| 精品日韩av| 欧美激情在线视频二区| 欧美videossex| 欧美激情久久久久| 黄页网站在线| 97视频com| 九色porny丨首页入口在线| 午夜精品久久久久久久久久久久| 97天天综合网| 国外成人性视频| 美女高潮在线观看| 日本a级片电影一区二区| 老司机成人影院| 国产成人在线一区| a∨色狠狠一区二区三区| 国产精品中文在线| 国产va免费精品观看精品| 亚洲va久久久噜噜噜| 三级欧美日韩| 国产一级二级三级精品| 亚洲8888| 在线成人性视频| 欧美成人午夜| 又粗又黑又大的吊av| 麻豆久久精品| 免费一区二区三区在线观看| 韩日av一区二区| 第一页在线视频| 91麻豆国产在线观看| 欧美成人国产精品一区二区| 中文字幕一区二区在线播放| 欧美国产在线看| 欧美日韩精品中文字幕| 国语对白做受69按摩| 欧美一区二区三区不卡| 天堂在线中文网| 一区二区三区精品99久久| caopo在线| 91国产美女视频| 成人a在线观看高清电影| 96久久精品| 九九热爱视频精品视频| 一区二区三区四区欧美| 在线成人h网| 午夜免费福利在线| 国产高清在线观看免费不卡| 色婷婷在线影院| 综合精品久久久| 中文字幕亚洲高清| 欧美精品第1页| 日本中文字幕一区二区有码在线| 日韩中文字幕在线免费观看| 蜜桃在线视频| 成人在线播放av| 自拍偷拍一区| 成年人看的毛片| 麻豆成人91精品二区三区| 波多野结衣办公室双飞| 国产欧美视频一区二区| 久久久久久久久久91| 欧洲人成人精品| 日韩有码第一页| 精品国产网站地址| 国产另类xxxxhd高清| 国产欧美丝袜| 欧美一区二区| av网站在线不卡| 99久久婷婷国产| 国产av 一区二区三区| 欧美最新大片在线看| 亚洲av片在线观看| 欧美多人爱爱视频网站| 成人久久网站| 欧美一区少妇| 日韩一级在线| 麻豆tv在线观看| 亚洲精品伦理在线| 91片黄在线观看喷潮| 亚洲人成欧美中文字幕| 91超碰在线播放| 99久久精品无码一区二区毛片 | 亚洲精品第三页| 国产无遮挡一区二区三区毛片日本| 精品无码黑人又粗又大又长| 91精品久久久久久久久99蜜臂| 国产1区2区3区在线| 日韩av色综合| 亚洲第一福利社区| av动漫在线看| 99精品欧美一区二区三区小说| 久久激情免费视频| 日韩欧美黄色影院| 大地资源网3页在线观看| 国产剧情久久久久久| 精品av一区二区| 久久婷婷国产91天堂综合精品| 91丨九色丨蝌蚪丨老版| 日韩乱码在线观看| 亚洲精品乱码久久久久久金桔影视| 91超碰在线免费| 精品欧美一区二区精品久久| 国产欧美日本| 大又大又粗又硬又爽少妇毛片| 日韩欧美国产一区二区| 日本福利片在线| 国产91精品在线播放| 国产精品欧美日韩一区| 我要看一级黄色大片| 国产精品嫩草99a| 国产精品综合在线| 久久不射电影网| 盗摄牛牛av影视一区二区| 无码熟妇人妻av在线电影| av资源站一区| 中文字幕一区在线播放| 一区二区中文字幕| 日本欧美在线| 好色先生视频污| 成人午夜电影久久影院| 97人人澡人人爽人人模亚洲| 亚洲精品自在久久| 国产精品久久久久77777丨| 亚洲啪啪av| 国产福利91精品一区| 久久精品国产亚洲av麻豆色欲| 亚洲加勒比久久88色综合 | 在线免费不卡视频| 91激情在线| 福利视频久久| 亚洲欧美日本日韩| 战狼4完整免费观看在线播放版| 91精品久久久久久久久99蜜臂| 97久久人人超碰caoprom| 欧美午夜视频在线| 久久成人18免费观看| 欧美日韩精品在线观看视频| 亚洲第一区在线| 巨胸喷奶水www久久久免费动漫| 小说区视频区图片区| 成人国产亚洲欧美成人综合网| 波多野结衣视频在线观看| 久久国产精品影视| 精品一区在线| 精品国产午夜福利在线观看| 福利微拍一区二区| 麻豆av在线免费看| 久久偷窥视频| 国模大尺度一区二区三区| yjizz国产| 久久av中文字幕| jiujiure精品视频播放| 日本女人性视频| 在线视频国内一区二区| 丝袜中文在线| 视频在线一区二区三区| 国产精品资源在线看| 精品国产青草久久久久96| 欧美极品少妇xxxxⅹ喷水|