Java中的小知識——執行緒池補充
- 2020 年 3 月 18 日
- 筆記
在我的執行緒池部落格中我已經粗略的說過了執行緒池。 執行緒池
但是我只說了一種創建執行緒池對象的方法 public static ExecutorService newFixedThreadPool(int nThreads);
但是我在使用中,發現這種方式並不受阿里巴巴歡迎。 因為使用Executor,都是默認的初始化參數。如果項目場景複雜的話,可能不好控制。

所以我又學習了其他方法。
創建和銷毀執行緒是非常耗時和耗資源的
如果系統中並發了很多執行緒,會對系統的性能造成很大的影響。
執行緒池就是解決執行緒聲明周期和資源不足的問題。 執行緒池是通過多個任務重複使用執行緒來家解決問題的。
java四種執行緒池
- newFixedThreadPool 這是我們上次說到的執行緒池,也是我用的,被阿里巴巴規範批了一頓。
創建固定大小的執行緒池。每次提交一個任務就創建一個執行緒,直到執行緒達到執行緒池的最大大小。執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常或執行完畢而結束,那麼執行緒池會補充一個新執行緒。
通俗:可以規定執行緒池的大小,小於這個數量就創建新執行緒。當達到這個數量,就只能有這些執行緒,別的任務等待運行的任務結束再使用執行緒。
- newCachedThreadPool(強烈推薦) 創建一個可快取的執行緒池。如果執行緒池的大小超過了處理任務所需要的執行緒,
那麼就會回收部分空閑(60秒不執行任務)的執行緒,當任務數增加時,此執行緒池又可以智慧的添加新執行緒來處理任務。此執行緒池不會對執行緒池大小做限制,執行緒池大小完全依賴於作業系統(或者說JVM)能夠創建的最大執行緒大小。
通俗:執行緒池的大小是根據jvm的大小而定的。當執行緒池的大小(核心執行緒池大小就是創建執行緒池的時候默認創建幾個執行緒)大於正在執行的任務的數量的時候,會去自動釋放那些空閑的執行緒,當任務增加,回去新添加執行緒。
ThreadPoolExecutor 及其構造方法參數 核心的參數有:
1、核心執行緒池大小 可以理解為系統最優的執行緒池數,執行緒池創建後會默認創建這個數的空閑執行緒 2、最大執行緒池大小 3、任務隊列
處理流程:
1、當可執行的任務小於核心執行緒池數的時候,每加一個任務就新建一個執行緒
2、當可執行的任務數達到核心執行緒池數的時候,新任務會放到任務隊列中去
3、當任務隊列數量滿了,並且最大執行緒池數大於核心執行緒池數,新任務就新建執行緒
4、當需要執行的任務總數超過任務隊列加最大執行緒池數時(也就是任務隊列和最大執行緒池數都滿了),就交給rejectHandle去做拋棄處理,策略有①直接捨棄、②拋異常 捨棄、或者③把任務隊列中最前面那個幹掉,重新嘗試執行任務
總結: 在隊列還沒滿的時候,一直都是多個任務重複的去使用執行緒。當隊列滿了,不大於最大執行緒池數,每加一個就創建一個執行緒。。。。。
- newSingleThreadExecutor
創建一個單執行緒的執行緒池。這個執行緒池只有一個執行緒在工作,也就是相當於單執行緒串列執行所有任務。如果這個唯一的執行緒因為異常結束,那麼會有一個新的執行緒來替代它。此執行緒池保證所有任務的執行順序按照任務的提交順序執行。
通俗:一個執行緒池中只能跑一個執行緒,單執行緒串列執行任務,但一個任務完成後才能進行下一個任務。
- newScheduledThreadPool
創建一個大小無限的執行緒池。此執行緒池支援定時以及周期性執行任務的需求。 通俗:支援任務調度的執行緒池。
我是學習了這篇文章所寫 參考:https://blog.csdn.net/vigoss77/article/details/81842199