生產有個對帳系統,天天須要從渠道端下載對帳文件,而後開始日終對帳。這個系統已經運行了好久,前兩天忽然收到短信預警,沒有獲取渠道端對帳文件。異步
「ide
ps:對帳系統詳細實現方式:聊聊對帳系統的設計方案函數
本覺得又是渠道端搞事情,上去一排查才發現,全部下載任務都被阻塞了。再進一步排查源碼,才發現本身一直用錯了線程池某個方法。工具
因爲線程建立比較昂貴,正式項目中咱們都會使用線程池執行異步任務。線程池,使用池化技術保存線程對象,使用的時候直接取出來,用完歸還以便使用。線程
雖然線程池的使用很是方法很是簡單,可是越簡單,越容易踩坑。細數一下,這些年來由於線程池致使生產事故也有好幾起。設計
因此今天,小黑哥就針對線程池的話題,給你們演示一下怎麼使用線程池纔會踩坑。code
但願你們看完,能夠完美避開這些坑~對象
Java 從 JDK1.5 開始提供線程池的實現類,咱們只須要在構造函數內傳入相關參數,就能夠建立一個線程池。blog
不過線程池的構造函數能夠說很是複雜,就算最簡單的那個構造函數,也須要傳入 5 個參數。這對於新手來講,很是不方便哇。開發
也許 JDK 開發者也考慮到這個問題,因此很是貼心給咱們提供一個工具類 Executors
,用來快捷建立建立線程池。
雖然這個工具類使用真的很是方便,能夠少寫不少代碼,可是小黑哥仍是建議生產系統仍是老老實實手動建立線程池,慎用Executors
,尤爲是工具類中兩個方法 Executors#newFixedThreadPool
與 Executors#newCachedThreadPool
。
若是你圖了方便使用上述方法建立了線程池,那就是一顆定時炸彈,說不許那一天生產系統就會