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...