爲什麼不建議用Executors?
Java爲什麼要創建Executors類? 考慮到ThreadPoolExecutor的構造函數實在是有些複雜,所以Java併發包裏提供了一個線程池的靜態工廠類Executors,利用Executors你可以快速創建線程池。由下圖可見,使用Executors類中提供的幾個靜態方法來創建線程池,內部實現均使用了 ThreadPoolExecutor 實現,其實都只是ThreadPoolExecutor 類的封裝。
不建議使用Executors的最重要的原因是:Executors提供的很多方法默認使用的都是無界的LinkedBlockingQueue(如下圖),高負載情境下,無界隊列很容易導致OOM,而OOM會導致所有請求都無法處理,這是致命問題。所以強烈建議使用有界隊列。 注:LinkedBlockingQueue是有界隊列,但是不設置大小的話,就默認爲Integer.MAX_VALUE,相當於無界隊列了。
Executors 返回的線程池對象的弊端:
1)FixedThreadPool 和 SingleThreadPool:
允許的請求隊列長度爲 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM。
2)CachedThreadPool 和 ScheduledThreadPool:
允許的創建線程數量爲 Integer.MAX_VALUE,可能會創建大量的線程,從而導致 OOM。
關於Executors的更多資料可以參考: https://blog.csdn.net/Henry_Lin_Wind/article/details/103768194