爲什麼不建議用Executors?

爲什麼不建議用Executors?

Java爲什麼要創建Executors類? 考慮到ThreadPoolExecutor的構造函數實在是有些複雜,所以Java併發包裏提供了一個線程池的靜態工廠類Executors,利用Executors你可以快速創建線程池。由下圖可見,使用Executors類中提供的幾個靜態方法來創建線程池,內部實現均使用了 ThreadPoolExecutor 實現,其實都只是ThreadPoolExecutor 類的封裝。

不建議使用Executors的最重要的原因是:Executors提供的很多方法默認使用的都是無界的LinkedBlockingQueue(如下圖),高負載情境下,無界隊列很容易導致OOM,而OOM會導致所有請求都無法處理,這是致命問題。所以強烈建議使用有界隊列。  注:LinkedBlockingQueue是有界隊列,但是不設置大小的話,就默認爲Integer.MAX_VALUE,相當於無界隊列了。

 

Executors 返回的線程池對象的弊端:

1)FixedThreadPoolSingleThreadPool:

     允許的請求隊列長度爲 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM。

2)CachedThreadPoolScheduledThreadPool:

     允許的創建線程數量爲 Integer.MAX_VALUE,可能會創建大量的線程,從而導致 OOM。

 

 

 關於Executors的更多資料可以參考: https://blog.csdn.net/Henry_Lin_Wind/article/details/103768194 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章