精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日本xxxxxwwwww| 亚洲欧洲综合网| 666av成人影院在线观看| 亚洲国产高清aⅴ视频| 欧美日韩黄色影视| 中文字幕一区二区中文字幕| 免费观看毛片网站| 麻豆免费精品视频| 午夜免费在线观看精品视频| 精品一区二区6| 高潮按摩久久久久久av免费| 欧美性xxxxxx少妇| 精品综合久久| 91成人在线免费| 国内黄色精品| 欧美大片一区二区三区| 午夜免费精品视频| 1区2区3区在线| 国产欧美日韩亚州综合 | 精品视频一区二区三区| 色婷婷久久久综合中文字幕| 久久在线中文字幕| www久久日com| 激情成人午夜视频| 琪琪第一精品导航| 久视频在线观看| 国产韩国精品一区二区三区| 亚洲片av在线| 先锋资源av在线| 美国十次综合久久| 欧美日韩国产综合久久| 免费黄色特级片| 1区2区3区在线| 亚洲亚洲人成综合网络| 手机在线视频你懂的| 中文字幕在线免费| 久久精品人人做人人综合| 精品国产乱码久久久久久郑州公司 | 日本精品一级二级| 日韩欧美一区三区| 91av久久| 午夜精品一区二区三区免费视频| 看全色黄大色大片| 国产视频中文字幕在线观看| 中文字幕在线观看一区| 性欧美.com| 国产黄在线观看| 欧美精彩视频一区二区三区| 色综合影院在线观看| 高清福利在线观看| 欧美激情一区在线| 亚洲一卡二卡| www在线免费观看视频| 亚洲免费观看视频| 超碰97在线看| 超碰在线97国产| 亚洲超碰精品一区二区| 精品久久一二三| 天堂8中文在线最新版在线| 婷婷丁香久久五月婷婷| 奇米精品一区二区三区| 成人福利视频| 欧美无砖砖区免费| 亚洲第一天堂久久| 日本一区二区乱| 精品国免费一区二区三区| 国产精品自拍片| 182在线播放| 欧美午夜片欧美片在线观看| 成人黄色一区二区| 日韩五码电影| 亚洲第一av在线| 99sesese| 日本成人手机在线| 亚洲激情视频在线播放| av黄色在线免费观看| 亚洲日本va| 日韩国产精品视频| 嘿嘿视频在线观看| 欧美在线免费| 欧美综合在线第二页| 在线观看视频中文字幕| 国产精品69毛片高清亚洲| 国产亚洲欧美另类一区二区三区| 免费理论片在线观看播放老| 亚洲图片激情小说| 欧美成人三级在线视频| 国产伊人久久| 亚洲第一区中文99精品| 超薄肉色丝袜一二三| 欧美一区二区三区久久精品茉莉花 | 精品人妻无码一区| 亚洲有吗中文字幕| 欧美一区二区视频97| 四虎免费在线视频| 久久精品一区| av成人综合网| h视频在线播放| 久久久久久久久久久久久夜| 亚洲永久一区二区三区在线| 高清视频在线观看三级| 欧美精品久久久久久久多人混战| 日本少妇xxxx| 99九九热只有国产精品| 欧美性受xxxx白人性爽| 99久久久国产精品无码网爆| 麻豆91在线观看| 国产区欧美区日韩区| 亚洲成a人v欧美综合天堂麻豆| 亚洲一卡二卡三卡四卡| 高清av免费看| 禁断一区二区三区在线| 7m精品福利视频导航| 国产日韩免费视频| 国产拍欧美日韩视频二区| 亚洲国产成人精品无码区99| 在线观看欧美| 一区二区三区国产在线观看| 中文字幕av久久爽一区| 尤物精品在线| 97超碰人人看人人| 欧美成人三区| 欧美亚洲综合网| 黄色在线观看av| 日韩视频不卡| 国产一区二区三区四区五区加勒比| 毛片在线看片| 欧美久久一区二区| 伊人影院综合网| 葵司免费一区二区三区四区五区| 精品国产电影| 日韩欧美精品一区二区三区| 精品国产乱码久久久久久夜甘婷婷| 日韩精品123区| 美日韩一区二区| 日韩资源av在线| 肉色欧美久久久久久久免费看| 亚洲精品国产综合久久| 日本午夜精品理论片a级app发布| 国产成人午夜精品影院观看视频| 麻豆映画在线观看| 免费观看亚洲视频大全| 九色成人免费视频| 亚洲精品一区二区口爆| 亚洲已满18点击进入久久| 国内自拍偷拍视频| 黑人一区二区三区四区五区| 亚洲精品免费一区二区三区| 亚洲电影视频在线| 精品久久久久香蕉网| 久久婷婷综合国产| 99久久99久久精品国产片果冻| 免费看国产一级片| 综合伊思人在钱三区| 热久久99这里有精品| 黄上黄在线观看| 欧美亚一区二区| 潘金莲一级黄色片| 亚洲欧洲日本mm| 国产精品91视频| 国产高清视频在线播放| 欧美日韩一本到| 制服丝袜在线第一页| 99国产精品久久久久久久| 久久99国产精品99久久| 日本韩国欧美| 日韩在线视频一区| 亚洲av无码国产精品永久一区 | 国产精品美女久久久久av爽| 久久久蜜桃精品| 九九视频精品在线观看| 91偷拍一区二区三区精品| 5g影院天天爽成人免费下载| 超碰在线99| 国产亚洲欧美aaaa| 国产伦一区二区| 五月婷婷色综合| 亚洲天堂最新地址| 丁香亚洲综合激情啪啪综合| 久久久免费视频网站| 欧美日韩国产高清电影| 91网免费观看| 吉吉日韩欧美| 久久天天躁狠狠躁夜夜躁| 国产精品va无码一区二区三区| 中文久久乱码一区二区| 91人妻一区二区| 久久婷婷影院| avove在线观看| 日本久久成人网| 91精品视频在线看| 91.xxx.高清在线| 日韩精品资源二区在线| 天天干天天干天天操| 日韩美女视频一区二区| 国产精品无码毛片| 亚洲欧洲另类| 一区二区三区av| 日本三级久久| 91九色露脸| 成人精品三级| 97精品视频在线观看| a级影片在线| 亚洲天堂av网| 特黄视频在线观看| 日韩手机在线导航| 欧美成人综合色| 国产欧美一区二区精品性色超碰| www.久久com| 免费人成在线不卡| 国产淫片免费看| 欧美日韩亚洲一区| 国产高清免费在线| 成人综合专区| 美日韩免费视频| 久久久久久毛片免费看 | 国产欧美日韩最新| 成人免费网站视频| 国内精品久久久久久中文字幕| 男人和女人做事情在线视频网站免费观看| 精品五月天久久| 高潮毛片7777777毛片| 欧美精品三级在线观看| 中文字幕一区二区三区人妻四季| 欧美小视频在线| 国产91av视频| 亚洲国产精品影院| 欧美日韩一级大片| 亚洲激情成人在线| 污软件在线观看| 国产精品久久免费看| 日本成人免费视频| 国产欧美日韩精品a在线观看| 久久亚洲AV成人无码国产野外 | 久久久国产一级片| 中文字幕欧美国产| 成人无码av片在线观看| 国产色综合一区| 久久婷婷五月综合| 国产精品视频看| 91精品久久久久久久久久久久| 国产亚洲福利社区一区| 欧美丰满老妇熟乱xxxxyyy| 久久久久9999亚洲精品| 免费观看av网站| 久久久www免费人成精品| 美女100%无挡| 中文子幕无线码一区tr | 亚洲第一主播视频| 日本午夜小视频| 日韩欧美极品在线观看| 欧美成人一区二区三区四区| 欧美伊人久久久久久午夜久久久久| 波多野结衣人妻| 欧美日韩一区视频| 99热这里只有精品1| 欧美xxxx在线观看| 头脑特工队2在线播放| 亚洲免费电影在线观看| 国产小视频免费在线观看| 中文字幕不卡在线视频极品| www.久久精品.com| 在线观看成人小视频| 久久久久久久久久一级| 欧美日韩的一区二区| 国产精品亚洲lv粉色| 欧美mv和日韩mv的网站| 婷婷色在线视频| 一区二区三区视频免费| 免费大片黄在线观看视频网站| 欧美乱大交xxxxx| 国产激情视频在线看| 国产精品igao视频| 精品一区二区三区在线观看视频| 国产精品一区在线观看| 国产亚洲一区| japanese在线播放| 美女久久一区| 天天综合成人网| 美女精品一区二区| 免费高清视频在线观看| 26uuu色噜噜精品一区二区| 免费在线观看日韩av| 91亚洲午夜精品久久久久久| 国产在线免费看| 天天操天天色综合| 一区二区三区播放| 日韩av在线电影网| 欧美一区二区三区| 91成人精品网站| 国产午夜久久av| 欧美精品一区二区三区在线看午夜| 久久精品国产68国产精品亚洲| 人人妻人人做人人爽| 久久精品av麻豆的观看方式| 欧美熟妇精品一区二区蜜桃视频| 国产精品久久久久一区| 日韩av一二三区| 欧美高清视频在线高清观看mv色露露十八 | 日韩第一页在线| 国精产品一区| 国产精品jizz在线观看麻豆| 第一区第二区在线| 波多野结衣三级在线| 久久久久久9| 老司机午夜免费福利| 亚洲视频一区在线| 国产男人搡女人免费视频| 亚洲第一色中文字幕| av免费在线观| 欧美黑人国产人伦爽爽爽| 青青热久免费精品视频在线18| 国产激情一区二区三区在线观看| 色琪琪久久se色| 国产v亚洲v天堂无码久久久| 99久久99久久免费精品蜜臀| 精品在线免费观看视频| 在线综合亚洲欧美在线视频 | 欧美激情一区二区三区高清视频| 欧美成人xxxx| 天堂精品视频| 日韩精品欧美成人高清一区二区| 在线观看国产免费视频| 亚洲一区av在线| 性生活免费网站| 另类专区欧美制服同性| 高清一区二区| 浴室偷拍美女洗澡456在线| 精品一区中文字幕| 91视频免费看片| 欧美三级电影在线观看| jizz在线免费观看| 国产精品日韩欧美大师| 欧美综合视频| 国产又大又黄又猛| 国产精品理伦片| 亚洲视频一区二区三区四区| 中文字幕日本欧美| 激情亚洲小说| 开心色怡人综合网站| 在线观看电影av| 国产一区香蕉久久| 国产精品主播视频| 日韩毛片久久久| 国产精品99久久久久久久久| 亚洲欧美日韩在线高清直播| 狠狠躁夜夜躁av无码中文幕| 欧美成人小视频| 日本超碰一区二区| 热久久最新地址| 国产91在线看| 欧美午夜性生活| 中文字幕va一区二区三区| 成人一二三四区| 中文字幕亚洲第一| crdy在线观看欧美| 亚洲色婷婷久久精品av蜜桃| 国产999精品久久久久久| 国产真实夫妇交换视频| 日韩av在线高清| 免费观看成人性生生活片| 亚洲v欧美v另类v综合v日韩v| 精品一区二区在线看| 免费在线观看日韩| 亚洲精品一区二区在线观看| 天堂av中文在线观看| 亚洲狠狠婷婷综合久久久| 精品一区二区三区久久久| 激情四射综合网| 国产视频欧美视频| 国产精品原创视频| 成人在线视频一区二区三区| 91色在线porny| 一级特黄aa大片| 午夜精品久久久久久久久久久久久| 国产一区二区区别| 4438x全国最大成人| 欧美日韩中国免费专区在线看| 日本成人网址| 国产伦精品一区| 另类小说综合欧美亚洲| 久久精品国产av一区二区三区| 亚洲区中文字幕| 精品视频在线播放一区二区三区| 国产精品沙发午睡系列| 亚洲视频每日更新| 欧美日韩在线中文字幕| 亚洲一区二区三区sesese| 国产精品毛片在线| 欧美日韩午夜视频| 精品视频中文字幕| 欧美经典影片视频网站| 日本男人操女人| 一区二区成人在线| www.亚洲资源| 久草精品电影| 国产精品99精品久久免费| 天天天天天天天干| 91tv亚洲精品香蕉国产一区7ujn| 夜间精品视频|