執行緒池狀態及原理

2021-10-24 10:08:12 字數 1590 閱讀 5346

running:初始化狀態是running.。執行緒池一單被建立,就處於running狀態,並且執行緒池中的任務書為0。running狀態下,能接受新的任務,以及對已經新增的任務進行處理。

shutdown:shutdown狀態時,不接受新的任務,但能處理已經新增的任務。代用執行緒池的shutdown()介面時,執行緒池有running->shutdown。

stop:不接受新任務,不處理已經新增的任務,並且中斷正在處理的任務。呼叫執行緒池的shutdownnow()介面時,執行緒池有(running或者shutdown)->stop

tidying:所有的任務都已終止,佇列中的「任務數量」為0,執行緒池會變成tidying。執行緒池變為tidying狀態時,會執行投資函式terminated(),可以通過過載terminated()函式來實現自定義行為。

terminated:執行緒池處於tidying狀態時,執行完terminated()之後,就會有tidying->terminated

檢視原始碼可得知,執行緒池當中有兩個集合。乙個queue和乙個hashset

//存放任務的佇列

private

final blockingqueue

workqueue;

//存放執行緒

private

final hashset

workers =

newhashset

();/**

* 核心執行緒數

*/private

volatile

int corepoolsize;

/** * 最大執行緒數

*/private

volatile

int maximumpoolsize;

新增任務時,如果執行緒池中的執行緒數沒有達到corepoolsize,則建立新的執行緒執行該任務。

如果已經達到corepoolsize,就將任務放入workqueue。

如果workqueue已經放滿,執行緒數量沒有達到maximumpoolsize,則建立執行緒執行該任務。

如果已經達到maximumpoolsize,則執行拒絕策略reject。

超時後執行緒被釋放,下降到corepoolsize

如果佇列中沒有任務,核心執行緒會一直阻塞在take(),知道返回任務,而執行完任務又會進入下一輪的take()方法。如果不是核心執行緒,進入獲取任務方法時會執行poll(long timeout, timeunit unit),等待一段時間去過去,獲取不到直接返回,runworker中如果獲取的任務為null時會執行processworkerexit銷毀執行緒。

timed_waiting,runnable,waiting.

沒有,和執行緒的建立前後也沒有關係,主要看當乙個執行緒沒有任務執行時,執行緒池中的現有執行緒數,如果大於核心執行緒數,那此執行緒就是非核心執行緒,如果小於核心執行緒數,那麼此執行緒就是核心執行緒。

執行緒池建立方式及執行緒池原理

執行緒池提交任務時的執行順序如下 向執行緒池提交任務時,會首先判斷執行緒池中的執行緒數是否大於設定的核心執行緒數,如果不大於,就建立乙個核心執行緒來執行任務。如果大於核心執行緒數,就會判斷緩衝佇列是否滿了,如果沒有滿,則放入佇列,等待執行緒空閒時執行任務。如果佇列已經滿了,則判斷是否達到了執行緒池設...

執行緒狀態 執行緒池

1.執行緒狀態變遷 2.為什麼notify notifyall wait要在同步方法或塊中執行 2.1在j a中,所有物件都能夠被作為 監視器monitor 指乙個擁有乙個獨佔鎖,乙個入口佇列和乙個等待佇列的實體entity。所有物件的非同步方法都能夠在任意時刻被任意執行緒呼叫,此時不需要考慮加鎖的...

執行緒池原理及python實現

為什麼需要執行緒池 目前的大多數網路伺服器,包括web伺服器 email伺服器以及資料庫伺服器等都具有乙個共同點,就是單位時間內必須處理數目巨大的連線請求,但處理時間卻相對較短。傳統多執行緒方案中我們採用的伺服器模型則是一旦接受到請求之後,即建立乙個新的執行緒,由該執行緒執行任務。任務執行完畢後,執...