1. 程式人生 > >淺看java執行緒池

淺看java執行緒池

      在專案中一般使用執行緒池來進行非同步、多執行緒操作,但是在建立執行緒池時也會又各種情況,比如說使用jdk自帶的Executors,在某些情況下會出現一些問題。

如上面提示所說,使用Executors在實際專案中執行的確會有各種風險。

那麼我們就需要手動的建立執行緒池。先上一張執行緒池相關類的關係:

 

我們這裡用的類是ThreadPoolExecutor,他的引數最多的構造方法是這樣的:

corePoolSize和maximumPoolSize是核心執行緒和最大執行緒大小,如果是固定執行緒大小,這兩個設定一樣的大小

keepAliveTime:當執行緒數量大於核心執行緒時,多的執行緒在等待新任務的最大時間。

workQueue:用來存放執行緒佇列的集合

threadFactory:執行緒工廠

handler:拒絕策略

現在來看這個執行緒池是怎麼執行的:

 翻譯一下這三段話:

1.如果當前執行執行緒小於corePoolSize,則命令建立新的執行緒作為首要任務,呼叫addWorker(新增工作者)自動檢查runState(執行狀態)和workerCount(工作數),因此當無法新增執行緒時會返回false。

2.如果任務已經成功的進入佇列(這裡的佇列應該就是指構造引數中的workQueue),我們還是會檢查我們是否應該新建一個執行緒(因為自從最近一次檢查後,存線上程死亡狀態)或者從進入這個方法後執行緒池被關閉。因此我們重複檢查狀態、在佇列停止時是否需要回滾、如果沒有執行緒是否啟動新的執行緒。

3.如果我們不能進行佇列任務,則我們會建立一個新執行緒。如果失敗,我們會停止,並且知道如何進行拒絕任務策略。

接下來看程式碼:

在滿足條件的情況下會進行執行addWorker方法

ThreadPoolExecutor大致執行流程可以總結一下:

1.任務執行時,先去判斷能否新增任務 :

一是判斷corePoolSize是否滿足,二是是否能夠進佇列workQueue(Executors的newFixedThreadPool方法沒有指定佇列長度,所以會預設最大數值)

2.新增任務後,執行時從ThreadFactory中newThread,之後啟動執行緒。