1. 程式人生 > >沒想到,這麼簡單的執行緒池用法,深藏這麼多坑!

沒想到,這麼簡單的執行緒池用法,深藏這麼多坑!

## 又又又踩坑了 生產有個對賬系統,每天需要從渠道端下載對賬檔案,然後開始日終對賬。這個系統已經運行了很久,前兩天突然收到簡訊預警,沒有獲取渠道端對賬檔案。 > ps:對賬系統詳細實現方式:[對賬系統設計與實現](https://studyidea.cn/articles/2019/08/26/1566790305561.html) 本以為又是渠道端搞事情,上去一排查才發現,所有下載任務都被阻塞了。再進一步排查原始碼,才發現自己一直用錯了執行緒池某個方法。 由於執行緒建立比較昂貴,正式專案中我們都會使用執行緒池執行非同步任務。執行緒池,使用池化技術儲存執行緒物件,使用的時候直接取出來,用完歸還以便使用。 雖然執行緒池的使用非常方法非常簡單,但是越簡單,越容易踩坑。細數一下,這些年來因為執行緒池導致生產事故也有好幾起。 所以今天,小黑哥就針對執行緒池的話題,給大家演示一下怎麼使用執行緒池才會踩坑。 希望大家看完,可以完美避開這些坑~ > 先贊後看,養成習慣。微信搜尋「**程式通事**」,關注就完事了! ## 慎用 Executors 元件 Java 從 JDK1.5 開始提供執行緒池的實現類,我們只需要在建構函式內傳入相關引數,就可以建立一個執行緒池。 ![](https://img2020.cnblogs.com/other/1419561/202006/1419561-20200629072838218-525629317.jpg) 不過執行緒池的建構函式可以說非常複雜,就算最簡單的那個建構函式,也需要傳入 5 個引數。這對於新手來說,非常不方便哇。 也許 JDK 開發者也考慮到這個問題,所以*非常貼心*給我們提供一個工具類 `Executors`,用來快捷建立建立執行緒池。 雖然這個工具類使用真的非常方便,可以少寫很多程式碼,但是小黑哥還是建議生產系統還是老老實實手動建立執行緒池,慎用`Executors`,尤其是工具類中兩個方法 `Executors#newFixedThreadPool`與 `Executors#newCachedThreadPool`。 如果你圖了方便使用上述方法建立了執行緒池,那就是一顆定時炸彈,說不準那一天生產系統就會