執行緒池中的執行緒何時死亡?

2021-09-25 19:25:17 字數 2754 閱讀 6563

runworker(this)

gettask()

其他介紹

面試被問到了, 結果說的不清楚。

回來看了下。

檢視從workqueue中gettask,當非core執行緒空閒時間超過keepalivetime, timeunit指定的時間後,則退出

(ps:超過空閒時間退出這個我是知道的,但是當時本能的認為不是問的這個,哭。。)

當thread#run完畢後,就結束。

new: new thread()後

runnable: thread.start()後

running: cpu排程到該執行緒的時候。一旦cpu放棄排程後或yield後,該執行緒成runnable

block: ,阻塞的io操作,獲取鎖的時候加入到鎖的阻塞佇列,

waitting:sleep, wait後加入waitset,join,selector的wakeup

terminalted: 執行緒終止。

threadpoolexecutor.execute(runnable);
可以看到當執行緒數少於核心數,core=true,表示需要新建執行緒。

回到addworker的過程中,注意這裡t.start()啟動了 worker中的執行緒。

worker是runnable的實現類, 內部含有thread

執行worker實現的run()->runworker(this)方法。

當執行完**runworker(this)**方法,執行緒也就自動走向了死亡。

可見,執行緒在迴圈中 一直從workqueue中取出threadpoolexecutor.execute(runnable)runnable

task不為空,就task.run執行任務。

當task為null則退出迴圈。然後結束該執行緒

執行緒啟動期間 runworker() ,迴圈gettask後run。

當gettask為空,則退出迴圈,結束執行緒。

因此,什麼時候返回null是關鍵。

下圖可見,當執行緒池關閉(這裡暫不細究),或者獲取任務超時都會導致返回null.

乙個atomicinteger,低28位用來表示執行緒數,高4位用來表示執行緒池狀態。

new threadpoolexecutor(corepoolsize, maximumpoolsize, keepalivetime, timeunit, workqueue,executors.defaultthreadfactory(), defaulthandler);execute提交任務時:

當execute時,執行緒小於corepoolsize,則addworker(firsttask,true)建立新執行緒。

當執行緒數量 大於核心數量corepoolsize後,則將任務入隊。

workqueue到達最大數量時,繼續建立執行緒直到執行緒數量大於maximumpoolsize當執行緒數量大於maximumpoolsize後,執行拒絕策略defaulthandlerterminalted:當非core執行緒空閒時間(gettask)超過keepalivetime, timeunit指定的時間後,則退出。

threadpoolexecutor允許核心執行緒退出,類似於5.

執行緒池中的柵欄

多執行緒中有三個類,分別是countdownlatch,cyclicbarrier,semaphore。代表著執行緒中的柵欄。共享鎖。在一組執行緒中,乙個執行緒等待其他執行緒。我把它理解為門栓。檢視該類的資料結構圖如下圖一 圖一 有乙個靜態的內部類,sync繼承自aqs。使用例子 如下 classn...

執行緒池中如何確定執行緒的數目

我用c寫了乙個執行緒池,但是在寫的時候沒有考慮執行緒池中線程的數目,當初直接隨便設定了乙個執行緒的數目。但是在面試時,將常被問到如何設定執行緒池中線程的數目的?我也在網上了搜了一些資料,今天在這裡就說一下 如何設定執行緒池中線程的數目?執行緒池中線程的數目是跟執行緒池所要處理的任務性質有關的 任務的...

執行緒池中如何確定執行緒的數目

簡單點計算 cpu密集型 cpu 1 io密集型 2 cpu 1 任務依賴性同混合型 針對不同的任務性質而言 cpu密集型任務應配置盡可能小的執行緒,如配置cpu個數 1的執行緒數,io密集型任務應配置盡可能多的執行緒,因為io操作不占用cpu,不要讓cpu閒下來,應加大執行緒數量,如配置兩倍cpu...