執行緒池工作原理

2021-09-02 04:16:39 字數 3688 閱讀 9508

執行緒池狀態的切換:

執行緒池關鍵類的uml圖:

執行緒池就是把任務提交和任務執行解耦。

首先看一下執行緒池的使用:

public static void main(string args) throws interruptedexception );//2,提交任務

es.shutdown();//3,執行緒池關閉

}

跟進原始碼:

(可以看出來只是對執行緒池物件threadpoolexecutor屬性的賦值)

public static executorservice newfixedthreadpool(int nthreads) 

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue)

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

幾個重要的引數:

基本大小,corepoolsize基本的工作執行緒數。

最大大小maximumpoolsize當工作執行緒大於core,且workqueue也滿了的情況下(arrayqueue),可以建立的最大工作執行緒。

保持存活時間keepalivetime阻塞佇列poll時的延時值,即如果執行緒在這個時間內仍然拿不到可以工作的任務,則殺死執行緒。

阻塞佇列workqueue工作大於等於coresize時用來阻塞的阻塞佇列

執行緒工廠threadfactory生成新執行緒的工廠類

拒絕策略rejectedexecutionhandler執行緒池停止或者滿了的時候的拒絕策略類

提交任務的關鍵思路

submit時如果狀態合適,會建立執行執行緒,去執行任務。

或者是執行狀態下,工作執行緒已經大於等於coresize的執行緒,則會放入到阻塞佇列,等待有空閒下來的執行緒來執行。

public future> submit(runnable task) 

public void execute(runnable command)

//二次檢查,如果執行緒池是執行狀態,則把command加入阻塞佇列中。

if (isrunning(c) && workqueue.offer(command))

//如果不能加入,則拒絕。(佇列已滿,嘗試再加入,如果加入失敗,則拒絕)

else if (!addworker(command, false))

reject(command);

}private boolean addworker(runnable firsttask, boolean core)

}boolean workerstarted = false;

boolean workeradded = false;

worker w = null;

try

} finally

//如果加入到workers,則啟動。

if (workeradded)

}} finally

return workerstarted;

}

public void run() 

final void runworker(worker w) catch (runtimeexception x) catch (error x) catch (throwable x) finally

} finally

}completedabruptly = false;

} finally }//

private runnable gettask()

int wc = workercountof(c);

// are workers subject to culling?

boolean timed = allowcorethreadtimeout || wc > corepoolsize;

//如果工作執行緒數已經大於最大數目並且 (工作執行緒數大於1或者工作隊列為空),cas減去工作執行緒數,返回。

if ((wc > maximumpoolsize || (timed && timedout))

&& (wc > 1 || workqueue.isempty()))

try catch (interruptedexception retry)

}}private void processworkerexit(worker w, boolean completedabruptly) finally

如果執行完成時執行緒池正在關閉,工作執行緒數為0,則把執行緒池狀態置為終止terminate

tryterminate();

int c = ctl.get();

if (runstatelessthan(c, stop))

addworker(null, false);}}

shutdown的操作

1判斷shutdown許可權

2修改執行緒池狀態,不再接受新任務

3interrupt所有執行緒

4修改狀態到terminal

public void shutdown()  finally 

tryterminate();

}final void tryterminate()

final reentrantlock mainlock = this.mainlock;

mainlock.lock();

try finally

return;

}} finally

// else retry on failed cas}}

執行緒池的工作原理

1 當提交乙個新任務到執行緒池時首先執行緒池判斷核心執行緒池 corepoolsize 是否已滿?沒滿,建立乙個工作執行緒來執行任務。滿了,則判斷工作佇列 workqueue 是否已滿?沒滿,則將新提交的任務儲存在工作佇列裡。滿了,則判斷最大執行緒池 maximumpoolsize 是否已滿?沒滿,...

執行緒池的工作原理

首先,當有乙個新的任務加入到執行緒池的任務佇列中時,執行緒池會先判斷當前執行緒數是否小於核心執行緒數,如果小於,這執行緒池會建立乙個新的執行緒 如果當前執行緒數大於或等於核心執行緒數,則會將這個新的任務加入到阻塞佇列中 這時如果任務的不斷加入導致阻塞佇列滿了,則執行緒池又會建立乙個新的臨時執行緒,處...

什麼是執行緒池?執行緒池的工作原理和使用執行緒池的好處

乙個執行緒池管理了一組工作執行緒,同時它還包括了乙個用於放置等待執行任務的任務佇列 阻塞佇列 預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0.當任務提交給執行緒池之後的處理策略如下 1 如果此時執行緒池中的數量小於corepoolsize 核心池的大小 即使執行緒池中的執行緒都處於空閒狀態...