
什么是執行緒池?
很簡單,簡單看名字就知道是裝有執行緒的池子,我們可以把要執行的多執行緒交給執行緒池來處理,和連接池的概念一樣,通過維護一定數量的執行緒池來達到多個執行緒的復用,
執行緒池的好處
我們知道不用執行緒池的話,每個執行緒都要通過new Thread(xxRunnable).start()的方式來創建并運行一個執行緒,執行緒少的話這不會是問題,而真實環境可能會開啟多個執行緒讓系統和程式達到最佳效率,當執行緒數達到一定數量就會耗盡系統的CPU和記憶體資源,也會造成GC頻繁收集和停頓,因為每次創建和銷毀一個執行緒都是要消耗系統資源的,如果為每個任務都創建執行緒這無疑是一個很大的性能瓶頸,所以,執行緒池中的執行緒復用極大節省了系統資源,當執行緒一段時間不再有任務處理時它也會自動銷毀,而不會長駐記憶體,
另外大家要注意:光理論是不夠的,在此順便送大家十套2020最新JAVA架構專案實戰教程及大廠面試題庫,進我扣裙 :七吧傘吧零而衣零傘 (數字的諧音)轉換下可以找到了,還可以跟老架構師交流
執行緒池核心類
在java.util.concurrent包中我們能找到執行緒池的定義,其中ThreadPoolExecutor是我們執行緒池核心類,首先看看執行緒池類的主要引數有哪些,
-
corePoolSize:執行緒池的核心大小,也可以理解為最小的執行緒池大小,
-
maximumPoolSize:最大執行緒池大小,
-
keepAliveTime:空余執行緒存活時間,指的是超過corePoolSize的空余執行緒達到多長時間才進行銷毀,
-
unit:銷毀時間單位,
-
workQueue:存盤等待執行執行緒的作業佇列,
-
threadFactory:創建執行緒的工廠,一般用默認即可,
-
handler:拒絕策略,當作業佇列、執行緒池全已滿時如何拒絕新任務,默認拋出例外,
執行緒池作業流程
1、如果執行緒池中的執行緒小于corePoolSize時就會創建新執行緒直接執行任務,
2、如果執行緒池中的執行緒大于corePoolSize時就會暫時把任務存盤到作業佇列workQueue中等待執行,
3、如果作業佇列workQueue也滿時:當執行緒數小于最大執行緒池數maximumPoolSize時就會創建新執行緒來處理,而執行緒數大于等于最大執行緒池數maximumPoolSize時就會執行拒絕策略,
執行緒池分類
Executors是jdk里面提供的創建執行緒池的工廠類,它默認提供了4種常用的執行緒池應用,而不必我們去重復構造,
-
newFixedThreadPool
固定執行緒池,核心執行緒數和最大執行緒數固定相等,而空閑存活時間為0毫秒,說明此引數也無意義,作業佇列為最大為Integer.MAX_VALUE大小的阻塞佇列,當執行任務時,如果執行緒都很忙,就會丟到作業佇列等有空閑執行緒時再執行,佇列滿就執行默認的拒絕策略,
- newCachedThreadPool
帶緩沖執行緒池,從構造看核心執行緒數為0,最大執行緒數為Integer最大值大小,超過0個的空閑執行緒在60秒后銷毀,SynchronousQueue這是一個直接提交的佇列,意味著每個新任務都會有執行緒來執行,如果執行緒池有可用執行緒則執行任務,沒有的話就創建一個來執行,執行緒池中的執行緒數不確定,一般建議執行速度較快較小的執行緒,不然這個最大執行緒池邊界過大容易造成記憶體溢位,
- newSingleThreadExecutor
單執行緒執行緒池,核心執行緒數和最大執行緒數均為1,空閑執行緒存活0毫秒同樣無意思,意味著每次只執行一個執行緒,多余的先存盤到作業佇列,一個一個執行,保證了執行緒的順序執行,

-
newScheduledThreadPool
調度執行緒池,即按一定的周期執行任務,即定時任務,對ThreadPoolExecutor進行了包裝而已,

拒絕策略
- AbortPolicy
簡單粗暴,直接拋出拒絕例外,這也是默認的拒絕策略,

- CallerRunsPolicy
如果執行緒池未關閉,則會在呼叫者執行緒中直接執行新任務,這會導致主執行緒提交執行緒性能變慢,

- DiscardPolicy
從方法看沒做任務操作,即表示不處理新任務,即丟棄,

- DiscardOldestPolicy
拋棄最老的任務,就是從佇列取出最老的任務然后放入新的任務進行執行,

如何提交執行緒
如可以先隨便定義一個固定大小的執行緒池
ExecutorService es = Executors.newFixedThreadPool(3);
提交一個執行緒
es.submit(xxRunnble);
es.execute(xxRunnble);
submit和execute分別有什么區別呢?
execute沒有回傳值,如果不需要知道執行緒的結果就使用execute方法,性能會好很多,
submit回傳一個Future物件,如果想知道執行緒結果就使用submit提交,而且它能在主執行緒中通過Future的get方法捕獲執行緒中的例外,
如何關閉執行緒池
es.shutdown();
不再接受新的任務,之前提交的任務等執行結束再關閉執行緒池,
es.shutdownNow();
不再接受新的任務,試圖停止池中的任務再關閉執行緒池,回傳所有未處理的執行緒list串列,
最后注意:光理論是不夠的,在此順便送大家十套2020最新JAVA架構專案實戰教程及大廠面試題庫,進我扣裙 :七吧傘吧零而衣零傘 (數字的諧音)轉換下可以找到了,還可以跟老架構師交流
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/193101.html
標籤:Java
