Java併發程式設計的藝術,學習筆記(五)執行緒池(二)

2021-09-09 05:28:59 字數 2216 閱讀 1207

兩級排程在於,一在於,我們將任務提交給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...