當執行緒池提交乙個新的任務時,執行緒池的處理流程如下:
執行緒池判斷核心執行緒池corepoolsize是否已滿(是否都在執行任務),未滿則建立執行緒執行任務;已滿則下一步
執行緒池判斷工作佇列blockingqueue是否已滿,未滿則將任務放進佇列;已滿則下一步
執行緒池判斷池中線程數是否達到maximumpoolsize(所有執行緒是否都已處在工作狀態),如果沒有則建立新的執行緒執行任務;如果已滿則交給飽和策略rejectedexecutionhandler處理。
有了上面的執行緒池處理流程,我們來看看執行緒池threadpoolexecutor執行execute方法流程,如下圖:
如果當前執行執行緒少於corepoolsize,則建立新縣城來執行任務(這一步需要獲取全域性鎖)
如果執行執行緒等於多於corepoolsize,則將任務加入blockingqueue
如果blockingqueue工作佇列已滿,則建立新的執行緒來處理任務(這一步需要獲取全域性鎖)
如果執行緒池飽和(工作佇列已滿,執行緒池數達到maximumpoolsize),任務將被拒絕,並呼叫飽和策略rejectedexecutionhandler.rejectexecution()處理
下面結合上面的流程來瞅瞅大鬍子 doug lea的原始碼
注釋中3個steps也對應著上面的流程
public
void
execute
(runnable command)if(
isrunning
(c)&& workqueue.
offer
(command)
)elseif(
!addworker
(command,
false))
reject
(command)
;}
Java併發 執行緒池原理
執行緒池是j.u.c中乙個非常常用的元件,利於執行緒池技術可以有效利於執行緒資源,避免頻繁的建立和銷毀執行緒造成的系統開銷,避免過多的建立執行緒耗盡系統資源,同時還可以更好對管理執行緒,包括關閉 中斷以及狀態監控等等。1.提交任務 2.核心執行緒數是否已滿 3.若核心執行緒數已滿,則將任務加入等待佇...
JAVA併發訪問 執行緒池
1.前言 在乙個 jvm 裡建立太多的執行緒可能會導致系統由於過度消耗記憶體而用完記憶體或 切換過度 為了防止資源不足,伺服器應用程式需要一些辦法來限制任何給定時刻處理的請求數目。2.執行緒池的作用 執行緒池為執行緒生命週期開銷問題和資源不足問題提供了解決方案。通過對多個任務重用執行緒,執行緒建立的...
java併發程式設計 執行緒池
降低資源消耗 提高響應速度 t1 執行緒建立的時間 t2 工作任務執行額時間 t3 執行緒銷毀時間 提高了執行緒的可管理性 corepoolsize 核心執行緒數 如果執行的執行緒數大於核心執行緒數,則會先進入到阻塞佇列裡 maxinumpoolsize 允許最大執行緒數 執行緒池所建立的執行緒數一...