文章首發於有間部落格,歡迎大夥光臨有間部落格
這是執行緒池在執行乙個任務時所呼叫的方法,我們看看是如何實現的
public
void
execute
(runnable command)
//執行緒池是否還是running狀態,如果是的話就往工作佇列中新增任務if(
isrunning
(c)&& workqueue.
offer
(command)
)//如果工作佇列滿了,就往最大執行緒池數中建立執行緒執行任務
elseif(
!addworker
(command,
false))
//執行拒絕策略
reject
(command)
;}
可以在上述的execute()中多次看見addworker方法,這個方法有兩個引數,第乙個是需要執行的任務,以及建立的是否是核心池中的執行緒。下面是具體的方法
private
boolean
addworker
(runnable firsttask,
boolean core)
}//能執行到這裡,代表上述流程已經走完,執行緒數名義上已經成功新增,下面就是真正新增執行緒的過程
//設定乙個判斷執行緒是否啟動
boolean workerstarted =
false
;//設定乙個判斷執行緒是否增加
boolean workeradded =
false
; worker w = null;
try}
finally
//如果成功新增執行緒
if(workeradded)}}
finally
return workerstarted;
}worker
(runnable firsttask)
以上就是執行緒池如何新增執行緒以及任務的過程,可以比較清晰的看出,在最後如果滿足要求是建立乙個新的執行緒,如果有任務就將該任務作為第乙個任務給執行緒執行。將執行緒啟動,但是執行緒啟動後是怎麼執行的?它是怎麼獲取到任務佇列的任務的?
可以在上述看到啟動執行緒的start的時候,會呼叫worker的run方法,直接來看看run方法
public
void
run(
)//真正執行執行緒邏輯的**,傳入執行緒實體
final
void
runworker
(worker w)
catch
(runtimeexception x)
catch
(error x)
catch
(throwable x)
finally
}finally
} completedabruptly =
false;}
finally
}
再來看看gettask()方法,是如何從任務佇列中取得任務去執行的
private runnable gettask()
//獲取可用的執行緒數
int wc =
workercountof
(c);
//這裡判斷是否需要使用超時
//allowcorethreadtimeout 如果為true則代表核心執行緒有超時時間,
//或者執行緒數大於核心執行緒數,則其他執行緒都會需要使用超時
// are workers subject to culling?
boolean timed = allowcorethreadtimeout || wc > corepoolsize;
//如果執行緒數已經大於最大池設定的執行緒數 或者 有設定超時並且已經超時並且執行緒數大於1或者任務隊列為空不需要進行時 if(
(wc > maximumpoolsize ||
(timed && timedout))&&
(wc >
1|| workqueue.
isempty()
))//如果上述情況,如超時,執行緒池狀態,執行緒數都沒有問題,則執行下面的獲取任務邏輯
trycatch
(interruptedexception retry)
}}
執行緒池在執行任務的時候,通過execute()傳入runnable任務,進行執行緒池狀態和執行緒的判斷,如果沒有什麼問題則會根據情況加入任務佇列或者是建立執行緒去執行任務。addworker()建立執行緒,並啟動執行緒並對傳入的任務進行執行。addworker()在呼叫start後進入runworker()進行執行目標執行緒的任務,如果傳入的任務為空,則會根據gettask()去任務佇列中取出任務執行。整個流程都需要保證執行緒池的狀態沒有問題。
如果有什麼地方標註錯誤請指出。
Linux下需要了解的一些東西
今天分享一些關於linux有必要知道的東西 1 proc目錄 linux系統上的 proc目錄是一種檔案系統,即proc檔案系統。與其它常見的檔案系統不同的是,proc是一種偽檔案系統 也即虛擬檔案系統 儲存的是當前核心執行狀態的一系列特殊檔案,使用者可以通過這些檔案檢視有關系統硬體及當前正在執行程...
react需要了解的一些概念
高階元件本質上是乙個函式,是可以傳遞乙個元件作為引數,並且會返回乙個新的元件,可以通過props的形式傳遞給目標元件,這樣目標元件可以直接在props裡面獲取使用就可以,在工作中,我們使用的connect withrouter 還有一些自己封裝復用的元件 basicfram公共標題 class he...
關於堆,棧的一些東西
堆和棧的區別 1 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 u 1 棧區 stack 由編譯器自動分配釋放 由編譯器在需要的時候分配,在不需要的時候自動清除 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。u 2 堆區 heap 一般由程式...