Java線程池

  1. 主要實現類:ThreadPoolExecutor

  2. 參數說明:

corePoolSize:核心線程數,線程池保有的線程的數量,即Worker的數量,如果allowCoreThreadTimeOut 參數不設置,即使這些線程空閒也不會被回收。也就是說如果allowCoreThreadTimeOut 參數不設置那麼當線程池內的線程的數量升至大於等於corePoolSize後,線程池至少會保有corePoolSize數量的線程。

workQueue:線程池工作隊列,當線程池內線程的數量達到corePoolSize並且這些線程都處於忙碌狀態時,那麼後續提交至線程池的任務會被緩存至工作隊列中,當線程池內有空閒線程時就會從此工作隊列中取任務並執行。

maximumPoolSize:線程池所允許的最大線程的數量,當工作隊列滿時,線程池會繼續創建新的線程,但是線程池內總線程數量不會超過maximumPoolSize。

keepAliveTime:當線程池內線程的數量超過corePoolSize時,超出部分線程的空閒等待時間,當空閒時間超過此值則超出部分線程就會被回收。

unit:keepAliveTime的單位。

threadFactory:用於創建線程。

handler:線程池任務拒絕策略接口,當工作隊列滿並且線程池忙碌線程數量達到maximumPoolSize後,後續提交至線程池的任務會被拒絕,此時回調此接口,自己實現具體的拒絕策略。如果此接口沒有指定則報java.util.concurrent.RejectedExecutionException異常。

  1. 線程池狀態:

其中AtomicInteger變量ctl的功能非常強大:利用低29位表示線程池中線程數,通過高3位表示線程池的運行狀態:
1、RUNNING:-1 << COUNT_BITS,即高3位爲111,該狀態的線程池會接收新任務,並處理阻塞隊列中的任務;
2、SHUTDOWN: 0 << COUNT_BITS,即高3位爲000,該狀態的線程池不會接收新任務,但會處理阻塞隊列中的任務;
3、STOP : 1 << COUNT_BITS,即高3位爲001,該狀態的線程不會接收新任務,也不會處理阻塞隊列中的任務,而且會中斷正在運行的任務;
4、TIDYING : 2 << COUNT_BITS,即高3位爲010,該狀態表示線程池對線程進行整理優化;
5、TERMINATED: 3 << COUNT_BITS,即高3位爲011,該狀態表示線程池停止工作;

  1. 實現原理

線程池會維護一個線程(Worker)集合workerSet和一個阻塞隊列workQueue。當用戶向線程池提交一個任務(Runnable)時,如果線程池Worker數量小於corePoolSize,線程池會new一個Worker並放入workerSet集合中,反之線程池會將任務放入workQueue中。如果workQueue滿了則會繼續new Worker,直到Worker數量達到maximumPoolSize。workerSet中的線程會不斷的從workQueue中獲取線程然後執行。當workQueue中沒有任務的時候,就會阻塞worker,直到隊列中有任務了就取出來繼續執行。詳見:https://blog.csdn.net/u013332124/article/details/79587436

線程銷燬:核心線程設置了允許超時或者對於超出corePoolSize的線程,在Worker循環從阻塞隊列中獲取任務時會設置一個等待時間,當超過這個時間,阻塞隊列返回null,Worker循環結束,此Worker被從workerSet中移除。

image


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