兩級排程在於,一在於,我們將任務提交給executor框架,然後executor建立執行緒來執行任務。二在於,執行緒對應於作業系統的執行緒,所以執行緒池中的執行緒再由作業系統核心給他們分配cpu資源。
主線程提交callable或者是runnable給executor執行,執行的過程上一節已經分析過原始碼了。
1)threadpoolexecutor
此類為核心類,下面的3個都是由threadpoolexecutor,不同引數規則建立而來。
2)fixedthreadpool
public
static executorservice newfixedthreadpool
(int nthreads)
固定容量的執行緒池,優點在於可以在負載比較高的伺服器上比較穩定。
3)singlethreadpool
public
static executorservice newsinglethreadexecutor()
建立容量只有1的執行緒池,適用於沒有多執行緒的場景,將任務按順序執行。
4)cachethreadpool
public
static executorservice newcachedthreadpool()
可以看到 cachethreadpool 的 核心執行緒數為0,最大執行緒數int最大值,幾乎是沒有限制。使用的是synchronousqueue,他的特點是不儲存任何元素, offer動作會被阻塞,直到有poll操作。
public
static executorservice newfixedthreadpool
(int nthreads)
keepalivetime值是0,所以有空閒的執行緒會直接被**。
使用的是linkedblockingqueue,他的預設容量是int的最大值。所以也可以看成是無界的阻塞佇列。
fixedthreadpool的執行示意圖。
無界的阻塞佇列那麼 maxinumpoolsize 引數就會無效,因為這個引數是在阻塞佇列滿之後才會去判斷的。
keepalivetime也會無效,因為這個值是執行緒數超過corepoolsize的部分的執行緒。
飽和策略也會無效,因為飽和策略是執行緒數觸及到類maxinumpoolsize後才會觸發的。
public
static executorservice newsinglethreadexecutor()
使用的也是linkedblockingqueue,預設容量大小,所以會出現和fixed同樣的問題。
執行示意圖。
public
static executorservice newcachedthreadpool()
我們對照著示意圖來說下。
corepoolsize 是 0 ,最大執行緒數是int最大值,keepalivetime是60秒,使用的是synchronousqueue阻塞佇列。
如果有空閒的執行緒,則會對任務進行poll來執行
如果沒有poll會失敗,則會建立乙個新的執行緒來執行
poll(keepalivetime,timeunit.nanoseconds) 等待60秒,如果沒有任務則會將中止執行緒
程式設計藝術學習筆記(1)
序言習題 1 通過一系列的替代,將四個變數的值 a,b,c,d 變為 b,c,d,a 用最少的步驟 開門菜,然而還是有很多值得思考的地方。能幫助人理解計算機對於賦值的操作。通過觀察,可以認為這是乙個a i 賦值給a i 1 的操作。最少的步驟,只需要五步即可。需要乙個t來作輔助,t a,a b,b ...
Java併發程式設計的藝術 筆記
併發存在的問題 上下文切換耗時,死鎖,軟硬體資源限制 解決方法 減少上下文切換 1.無鎖併發程式設計 讓不同的執行緒處理不同的資料段 將資料id採用hash演算法分配給不同的執行緒 2.cas演算法 compare and set使用jni 3.使用最少執行緒 減少處於waiting狀態的執行緒 j...
《Oracle程式設計藝術》學習筆記 23 段
段就是占用儲存空間的資料庫物件,占用儲存空間的每乙個物件最後都會儲存在乙個段中,如表 索引 回滾段等。段的型別 1 表段 2 表分割槽段 table partition 或子分割槽段 subpartition 這種段型別用於分割槽,與表段很相似。分割槽表由乙個或多個分割槽段 table partit...