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

有些線程跑著跑著就不見了

開發 前端
憑著老程序員的經驗,猜到可能是異步線程內發生了異常,導致異步線程退出,不再繼續執行。而又因為上述代碼「吃掉」了異常,這就導致我們從外部看起來這個工程跑著跑著就不動了,日志什么也沒了。

[[377581]]

本文轉載自微信公眾號「小黑十一點半」,作者樓下小黑哥。轉載本文請聯系小黑十一點半公眾號。   

前言

Hello,大家好,我是樓下小黑哥~

最近接了一個業務需求,需求倒是不難,三下五除二就整理出設計方案,然后就開始代碼改造。

啪,很快,就完成代碼改造,然后提測給測試小姐姐。

小姐姐前面測試好好的,測到這個工程的時候,突然跟我反饋,你看這個這個工程跑著跑著就不動了,日志什么也沒了。

那時候正在忙,想著我就沒改幾行代碼,也沒涉及核心邏輯,那肯定沒問題的。

于是回復小姐姐,業務邏輯執行的太慢了吧,再等個半小時再看看?

一小時后,小姐姐又來找我,我都等了一小時,這個工程還是沒動啊,日志還是沒有啊。

這下不能拖了,上去仔細一看,還真是,怎么就沒了呢?

先簡單說下這段代碼,就是使用一個異步線程執行一段業務邏輯,示例代碼如下:

  1. // 前置邏輯 
  2. ..... 
  3. Thread thread=new Thread(new Runnable() { 
  4.     @Override 
  5.     public void run() { 
  6.         try { 
  7.            // 異步線程執行其他業務邏輯 
  8.         } catch (Exception e) { 
  9.            // 不進行任何代碼處理 
  10.         } 
  11.     } 
  12. }); 
  13. thread.start(); 

憑著老程序員的經驗,猜到可能是異步線程內發生了異常,導致異步線程退出,不再繼續執行。而又因為上述代碼「吃掉」了異常,這就導致我們從外部看起來這個工程跑著跑著就不動了,日志什么也沒了。

于是改造了一下,打印出相關異常日志,最終定位問題,原來是小姐姐造的數據存在問題,從而引發 NPE 問題。

「不知道大家有沒有碰到過上面的情況,使用線程異步執行相關邏輯,但是執行到一半突然就像卡主一般,不再繼續往下執行。」

小黑哥碰到過幾次,這幾次原因都不太相同,總結起來分為下面三種情況:

  • 異步任務長時間被阻塞
  • 異步任務發生異常
  • 異步任務異常被吃掉

異步任務長時間被阻塞

第一種,異步線程執行任務,這個任務需要通過網絡調用其他遠端服務。假設服務端響應的非常慢,而我們設置的網絡超時時間又很長,這就會導致這個線程長時間被阻塞。

假設異步任務偽碼如下:

  1. ThreadPoolExecutor threadPool= ....; 
  2. threadPool.execute(() -> { 
  3. // 1.調用遠端服務 
  4. Socket socket....; 
  5. // 2.設置超時時間 
  6. socket.setSoTimeout(60*1000); 
  7. // 3.讀取服務端返回 
  8. socket.read(); 
  9. }); 

上面程序中,如果服務端一直沒有返回,那么異步線程將會一直被阻塞,直到超時。

這種情況其實還好,我們無非等待一段時間,就可以看到異步線程繼續往下執行任務。

舉一個極端的例子,假設上面的代碼沒有設置超時時間,而服務端一直沒有返回響應,「此時異步線程就會被一直阻塞」。

除了上面網絡讀取阻塞的例子,常見情況還有

  • 執行了長時間休眠,比如 TimeUnit.MINUTES.sleep(60)
  • 內部發生了死鎖
  • 等等

如果異步線程長時間被阻塞,而異步任務執行又比較頻繁,那么線程池內可用線程將會被慢慢耗盡,此時后續任務就會被拒絕執行。

解決辦法

其實非常簡單,首先我們使用 jstack 命令 「dump」 一下當前 Java 應用的線程堆棧情況,然后根據線程池名字定位相關線程即可。

網上隨便找了堆棧圖

如果沒有自定義線程池 ThreadFactory 參數,那查找定位被阻塞線程就比較麻煩了。

所以創建線程池建議自定義 ThreadFactory 參數,這對于后期排查問題非常有用。

異步任務異常未捕獲

上面的情況,異步線程其實還活著,只是被阻塞沒辦法執行后續的邏輯。

那這一類情況呢,與上面不太一樣,由于異步任務內部發生錯誤,拋出異常,而代碼邏輯中又沒有進行捕獲處理,從而導致線程提前異常退出。

異常退出偽碼如下:

  1. // 1.創建執行的任務 
  2. Runnable runnable=new Runnable() { 
  3.     @Override 
  4.     public void run() { 
  5.        // 執行前置邏輯 
  6.         // 拋出異常 
  7.         int i=100/0; 
  8.        // 執行后置邏輯 
  9.          
  10.     } 
  11. }; 
  12. // 2.創建線程 
  13. Thread thread=new Thread(runnable); 
  14. // 3.運行異步線程 
  15. thread.start(); 
  16. // 其他業務邏輯 

上述代碼中,異步線程執行到除零邏輯,將會拋出異常,然后異步線程將會異常退出。

「異步線程內拋出的異常日志僅僅只會被打印到控制臺,而不會被記錄到日志文件中。」

所以正常的業務日志中是見不到線程異常的日志,這就給了我們一種假象,異步線程看起來還在執行任務,其實它已經掛了。

PS:上面的話可能不好理解,舉個例子,如果你使用 IDEA 執行上面這段程序,異常日志將會被輸出到 IDEA 下方控制臺。

而如果我們在 Linux 機器上執行這段程序,異常日志僅僅只會顯示在當前終端窗口上,一旦關閉當前終端窗口,日志就沒。了。

如果想要保存這種日志,我們需要將 stdout 重定向到日志文件中,比如執行以下命令:

  1. -- 將 stdout 重定向輸出到文件中 
  2. nohup java  xxxx > $STDOUT_FILE 2>&1 & 

解決辦法

第一種解決辦法,其實很多讀者已經想到了,異步線程內使用 try..catch 語句捕獲所有異常即可。

「沒錯,就是這么簡單。」

不過這里提一點,一般我們使用 try..catch僅僅只會捕獲 Exception異常。

那么極端情況下,異步線程內如果拋出 Error,比如拋出了 java.lang.NoClassDefFoundError,此時是沒法捕獲,異步線程依舊會異常退出。

所以我們可以使用try..catch捕獲 Throwable,這樣及時發生 Error錯誤,也會被捕獲。

不過個人覺得捕獲Exception異常就夠了,正常工程應用很少會發生 Error錯誤,所以我們只要了解有這個可能即可。

ps:之前同事上線一個應用,使用異步線程執行任務,每次執行到一半,都不再繼續執行。

由于異步線程內使用try..catch捕獲處理了 Exception異常,所以找了半天不知道什么問題。

最后,小黑哥排查 stdout 輸出日志,才發現異步線程發生 Error錯誤。

這種解決本法需要我們主動去捕獲異常,而下面第二種解決辦法,設置線程異常處理方法。

一旦設置完成,如果異步線程內發生異常,線程退出之前將會調用異常處理方法。

我們拿 Thread 來講,其設置方法如下:

  1. Runnable runnable=new Runnable() { 
  2.     @Override 
  3.     public void run() { 
  4.         int i=100/0; 
  5.     } 
  6. }; 
  7.  
  8. Thread thread=new Thread(runnable); 
  9. thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
  10.     @Override 
  11.     public void uncaughtException(Thread t, Throwable e) { 
  12.         System.out.println(t.getName()+"發生異常"+e.getMessage()); 
  13.     } 
  14. }); 
  15. thread.start(); 

不過生產環境不建議直接使用 Thread,我們需要使用線程池代替。

線程池設置異常處理方法可以分為兩種,如果我們使用 ThreadPoolExecutor#execute執行異步任務,那我們需要在自定義線程池的時候,使用 ThreadFactory 設置。

  1. ThreadPoolExecutor threadPool =new ThreadPoolExecutor( 
  2.         5, 
  3.         10, 
  4.         60, 
  5.         TimeUnit.SECONDS,new ArrayBlockingQueue<>(100), 
  6.       // 這里使用 Guava 的 ThreadFactoryBuilder 類,方便構造 ThreadFactory 
  7.         new ThreadFactoryBuilder().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
  8.             @Override 
  9.             public void uncaughtException(Thread t, Throwable e) { 
  10.                 // 處理異常 
  11.             } 
  12.         }).build() 
  13.         ); 

如果你當前使用 ThreadPoolExecutor#submit執行異步任務,那就簡單了,我們可以直接通過 Future#get獲取到線程內拋出的異常。

  1. Future<?> future = threadPool.submit(new Callable<Object>() { 
  2.     @Override 
  3.     public Object call() throws Exception { 
  4.         return "小黑十一點半"
  5.     } 
  6. }); 
  7.  
  8. try { 
  9.     future.get(); 
  10. } catch (InterruptedException e) { 
  11.     e.printStackTrace(); 
  12. } catch (ExecutionException e) { 
  13.     // 線程內拋出異常將會被封裝在 ExecutionException 內 

異步任務異常被吃掉

好了,終于到最后一種情況了,小黑哥這次碰到就是這種??。

這種情況具體來說就是異步線程內使用 try..catch 語句捕獲了所有異常,但是沒有在 catch語句中進行任何代碼處理。

  1. Thread thread=new Thread(new Runnable() { 
  2.     @Override 
  3.     public void run() { 
  4.         try { 
  5.             int i=100/0; 
  6.         } catch (Exception e) { 
  7.            // 不進行任何代碼處理 
  8.         } 
  9.     } 
  10. }); 
  11. thread.start(); 

如上述代碼所示,catch語句中沒有進行任何代碼處理。即使異步線程內真發生了異常,也不會有任何提示,這個異常就像被吃掉一般。

總結

多線程編程原本就比較復雜,我們需要處理各種問題,那今天主要介紹了一下其中的一個問題:

「異步線程突然停止,就像卡主一般,不再繼續執行代碼邏輯,沒有任何響應」

那這類問題,小黑哥根據自己碰到情況,總結為三類:

  • 異步任務長時間被阻塞
  • 異步任務異常
  • 異步任務異常被吃掉。

對于第一種,我們在網絡編程中及時設置超時時間,一般都能避免。

對于第二、第三種情況,這就需要我們建立一個良好的編程習慣,使用try..catch 捕獲所有異常,并且 catch塊中一定做一些處理,比如說打印相關日志。

 

責任編輯:武曉燕 來源: 小黑十一點半
相關推薦

2017-01-18 20:29:00

Windows 10啟動欄解決方案

2021-12-02 22:27:30

Windows 11Windows微軟

2014-12-26 10:01:04

架構

2020-12-17 12:25:54

Java進程內存

2021-10-15 20:24:19

AI

2017-06-07 15:16:03

Windows 10Windows以太網圖標

2021-04-28 17:01:18

Windows 10Windows微軟

2020-12-03 19:49:21

微信表情移動應用

2024-12-10 12:56:32

馬斯克機器人Optimus

2021-12-19 07:25:10

Windows 11操作系統微軟

2021-06-03 21:13:03

內存Python管理

2024-01-15 16:34:13

模型訓練

2023-03-15 16:24:43

云數據庫代碼開發

2021-03-01 06:28:17

微信表情騰訊

2021-10-29 06:46:42

CPU緩存TLB

2021-09-16 18:29:17

CPU緩存虛擬

2023-09-13 07:23:22

顯卡NVIDIAIntel

2011-08-17 15:08:08

windows7任務欄縮略圖

2015-07-06 09:51:39

2011-11-16 11:12:46

DNSDNS記錄DNS恢復
點贊
收藏

51CTO技術棧公眾號

av在线精品| 亚洲一区欧美在线| 免费欧美网站| 午夜精品久久久久久久久久久 | 人成网站在线观看| 欧美在线电影| 精品国产精品一区二区夜夜嗨| 亚洲综合激情五月| 天堂在线视频观看| 麻豆精品久久精品色综合| 亚洲天堂一区二区三区| 成人免费播放视频| 韩国精品主播一区二区在线观看 | 成人自拍偷拍| 神马久久久久久久| 欧美美乳视频| 日韩三级视频在线观看| 17c丨国产丨精品视频| 福利片在线看| 成人av片在线观看| 成人国产精品色哟哟| 亚洲天堂一区在线| 国内精品久久久久久99蜜桃| 日韩欧美的一区二区| 日韩中文字幕免费在线| 国产天堂在线播放视频| 中文字幕亚洲在| 亚洲最大的av网站| 在线免费一区二区| 亚洲欧美网站| 日韩性生活视频| 人妻av无码一区二区三区| 福利片在线一区二区| 91精品在线观看入口| 搡女人真爽免费午夜网站| 女海盗2成人h版中文字幕| 亚洲精品成人悠悠色影视| 不卡日韩av| 国产又粗又猛视频| 欧美96一区二区免费视频| 欧美专区在线观看| 色婷婷在线观看视频| 国内精品嫩模av私拍在线观看| 日韩av一区二区在线| 欧美激情第四页| 91精品亚洲一区在线观看| 欧美手机在线视频| 97超碰人人澡| 久草免费在线色站| 亚洲午夜久久久久久久久电影院| 欧美日韩国产不卡在线看| 欧美视频一二区| 成人夜色视频网站在线观看| 成人av免费在线看| 成人爽a毛片一区二区| 岛国一区二区三区| 国产精品9999久久久久仙踪林| 日韩手机在线视频| 翔田千里一区二区| 青青久久aⅴ北条麻妃| 欧美黑人一区二区| 久久最新视频| 国产精品老女人视频| 艳妇乳肉豪妇荡乳av无码福利 | 妺妺窝人体色www在线小说| 91九色国产在线播放| 亚洲国产精品t66y| 亚洲一区三区| 色呦呦网站在线观看| 亚洲韩国精品一区| 欧美a在线视频| 草民电影神马电影一区二区| 欧美浪妇xxxx高跟鞋交| 亚洲熟女乱综合一区二区| 成人av观看| 欧美无砖砖区免费| 毛片毛片毛片毛片毛| 超碰在线成人| 亚洲欧美日韩精品久久亚洲区 | 91丨porny丨国产入口| 欧美不卡福利| 久久黄色美女电影| 午夜精品一区在线观看| 台湾无码一区二区| 性孕妇free特大另类| 欧美日韩一卡二卡| 图片区偷拍区小说区| 亚洲va久久| 麻豆国产精品va在线观看不卡| www.日本高清视频| 九热爱视频精品视频| 日韩中文理论片| 天堂av网手机版| 欧美日韩在线大尺度| 2019中文字幕在线| 91久久国语露脸精品国产高跟| 热久久国产精品| 97欧洲一区二区精品免费| 亚洲人在线观看视频| 亚洲三级在线免费| 欧美成人精品欧美一级乱| 精品国产一区二区三区2021| 日韩激情视频在线| 黄色录像免费观看| 久久高清免费观看| 成人av资源网| 亚洲s色大片| 色综合一个色综合| 欧美性生交xxxxx| 欧美国产一区二区三区激情无套| 久久九九国产精品怡红院| 亚洲精品成人av久久| 亚洲激情精品| 成人免费直播live| 国产三级在线看| 天天色图综合网| 久久黄色一级视频| 日韩精品不卡一区二区| 2020久久国产精品| 亚洲欧美一二三区| www.欧美色图| 欧美xxxx吸乳| 欧洲精品久久久久毛片完整版| 7777精品伊人久久久大香线蕉| 日本77777| 国产一区二区三区四区五区| 97视频人免费观看| 朝桐光av在线一区二区三区| 中文字幕不卡在线播放| 欧美私人情侣网站| 蜜乳av综合| 日韩在线播放av| 国产精品成人久久| 久久久久国产精品一区二区 | 日韩在线国产| 亚洲欧美se| 日韩毛片在线看| 日韩精品久久久久久久的张开腿让| 亚洲国产成人精品女人| 国产精品日韩在线一区| 黄色片在线播放| 91久久一区二区| 国产精品果冻传媒| 很黄很黄激情成人| 国产精品黄页免费高清在线观看| 国产福利免费视频| 亚洲欧美日韩中文播放| 少妇高潮喷水久久久久久久久久| 免费成人高清在线视频| 色婷婷久久一区二区| 中文字幕精品一区二| 国产精品视频在线看| 日本xxxx黄色| 天堂网在线观看国产精品| 国产欧美在线视频| 国产福利视频在线观看| 日韩色视频在线观看| 极品久久久久久| 国产福利91精品一区| 无码日本精品xxxxxxxxx| 国产劲爆久久| 日韩免费av一区二区| 午夜在线小视频| 91精品国产综合久久香蕉麻豆| 懂色av粉嫩av蜜乳av| 免费中文字幕日韩欧美| 亚洲高清在线播放| 无遮挡在线观看| 亚洲午夜未删减在线观看 | 久久发布国产伦子伦精品| 欧美精品九九| 久久综合一区| 成人在线免费av| 色综合五月天导航| 午夜性色福利视频| 欧美日韩国产高清一区二区三区| 亚洲AV无码国产成人久久| 人人狠狠综合久久亚洲婷| 午夜精品视频在线| 国产高清免费在线播放| 欧美一二三四区在线| 中文字幕亚洲高清| 国产精品午夜在线观看| xxxx国产视频| 三级久久三级久久久| 三年中国中文在线观看免费播放| 成人黄色在线| 久久99热这里只有精品国产| 性感美女福利视频| 欧美日韩亚洲精品一区二区三区 | 中文字幕福利视频| 一区二区免费在线| 老头老太做爰xxx视频| 国产精品亚洲一区二区三区妖精| 超碰97在线看| 麻豆一区在线| 日本老师69xxx| 羞羞视频在线免费国产| 亚洲欧美国产一本综合首页| 国产白浆在线观看| 91久久线看在观草草青青| 天天躁日日躁aaaa视频| 天堂va蜜桃一区二区三区| 欧美三级午夜理伦三级老人| 免费成人网www| 懂色av一区二区三区在线播放| 91破解版在线观看| 久久夜色精品国产| 国产精品免费观看| 亚洲娇小xxxx欧美娇小| 日韩不卡视频在线| 亚洲免费看黄网站| 91丨porny丨对白| 久久91精品国产91久久小草| 艳色歌舞团一区二区三区| 国产中文欧美日韩在线| 日韩av电影在线免费播放| 男女在线视频| 伦伦影院午夜日韩欧美限制| www.亚洲.com| 精品一区精品二区| 色噜噜在线播放| 日韩欧美黄色影院| 国产色视频在线| 欧美日韩激情一区二区| 久久精品国产亚洲av麻豆蜜芽| 国产精品久久夜| 国产精品密蕾丝袜| 国产精品自拍网站| 中文字幕亚洲乱码| 日本免费在线视频不卡一不卡二 | 99精品99| 国产激情片在线观看| 在线电影一区二区| 黄色免费高清视频| 香蕉久久精品日日躁夜夜躁| 99国产在线观看| 一区二区三区四区视频免费观看| 欧美一级高清免费| 亚洲天堂资源| 蜜臀久久99精品久久久久久宅男 | 国产乱国产乱老熟| 黄色91在线观看| 精品国产免费观看| 福利微拍一区二区| 久久夜色精品国产噜噜亚洲av| 亚洲欧美一区二区三区久本道91| 最近中文字幕无免费| 蜜桃av一区二区三区电影| 亚洲成人av免费看| 雨宫琴音一区二区在线| 欧日韩免费视频| 日韩一级免费| 国产a级一级片| 日本中文字幕不卡| 亚洲综合av在线播放| 国产尤物一区二区在线| 日批视频免费看| 久久成人av少妇免费| 亚洲免费成人在线视频| 国产馆精品极品| 夜夜夜夜夜夜操| 国产激情一区二区三区| 人妻换人妻a片爽麻豆| 国内精品不卡在线| 又大又长粗又爽又黄少妇视频| 奇米影视一区二区三区小说| 91欧美视频在线| 狠狠色丁香婷婷综合久久片| 99国产精品免费视频| 九色综合狠狠综合久久| 国产在线a视频| 91香蕉视频mp4| 国产精品久久久久久成人| 久久久久久9999| 91免费在线看片| 日本一区二区三区国色天香| 三级电影在线看| 欧美韩国日本不卡| 午夜69成人做爰视频| 精品久久久久久中文字幕| 国产网站在线看| 欧美亚洲图片小说| www.看毛片| 亚洲天天在线日亚洲洲精| 91麻豆国产福利在线观看宅福利| xx视频.9999.com| xxx.xxx欧美| 国产精品狼人色视频一区| 69堂免费精品视频在线播放| 91在线免费观看网站| 精品国产午夜肉伦伦影院| 风间由美久久久| 凹凸成人精品亚洲精品密奴| 国产一级大片免费看| 丝袜a∨在线一区二区三区不卡| 欧美女人性生活视频| 激情av综合网| 一本色道久久综合亚洲精品图片 | 天海翼在线视频| 天天影视网天天综合色在线播放| 日韩 欧美 综合| 日韩一级高清毛片| 午夜精品久久久久久久爽| 亚洲男人7777| 久久五月精品中文字幕| 国产视频观看一区| 亚洲精品无吗| 欧美日韩激情四射| 国产综合精品一区| 国产黄页在线观看| 国产做a爰片久久毛片| 亚洲av无码一区二区三区人| 国产欧美精品国产国产专区| 国产18无套直看片| 一色屋精品亚洲香蕉网站| 欧美日韩一二三四区| 亚洲а∨天堂久久精品喷水| 欧美老女人性开放| 欧美激情手机在线视频| 9999在线精品视频| 日韩精品一区二区三区丰满| 99国产精品私拍| 波多野结衣办公室双飞| 亚洲狠狠丁香婷婷综合久久久| 69成人免费视频| 亚洲精品美女在线| aaa日本高清在线播放免费观看| 久久天堂av综合合色| 黑人一区二区三区| 成人午夜电影在线播放| 中文字幕一区二区三区乱码图片 | 天堂精品一区二区三区| 美女久久网站| 美女洗澡无遮挡| 一本大道久久a久久精二百| 999免费视频| 久久精品久久久久久| 成人精品国产亚洲| 亚洲第一导航| 乱一区二区av| 国产又黄又粗又猛又爽的| 欧美日韩国产综合一区二区三区 | 久久久一本二本三本| 成人免费毛片片v| 国产一卡二卡在线| 亚洲国产又黄又爽女人高潮的| 91看片在线观看| 国产精品综合网站| 99re6这里只有精品| 乌克兰美女av| 亚洲欧洲www| www.热久久| 欧美性视频网站| 精品日产免费二区日产免费二区| 日b视频免费观看| eeuss影院一区二区三区| 久久久久久久久久久久久av| 亚洲欧洲第一视频| 成人深夜福利| 国产人妻人伦精品| 成人aaaa免费全部观看| 欧美a∨亚洲欧美亚洲| 国产一区二区三区视频| 牛牛精品一区二区| 日本不卡久久| 精品一二三四区| 亚洲AV无码成人精品区明星换面 | 91 中文字幕| 久久综合亚洲社区| 国产欧美自拍一区| 无码无遮挡又大又爽又黄的视频| 不卡一区二区中文字幕| 国产免费av一区| www.亚洲人.com| 老司机成人在线| 免费超爽大片黄| 久久精品一区二区三区不卡牛牛 | 就去色蜜桃综合| 老色鬼精品视频在线观看播放| 在线不卡av电影| 91麻豆精品久久久久蜜臀| 999精品网| 五月天久久狠狠| 东方欧美亚洲色图在线| 久久久久久久久久综合 | 欧美二区乱c黑人| 性欧美xxxx免费岛国不卡电影| 欧美视频免费看欧美视频| 福利电影一区二区| 免费无码毛片一区二区app| 亚洲免费视频在线观看| 国产美女视频一区二区| 成年人三级视频| 久久免费偷拍视频| 国内精品久久久久久久久久久| 欧美日本黄视频| 精品日产免费二区日产免费二区| 国产麻花豆剧传媒精品mv在线| 成人av资源网站|