執行緒池 juc包下

2021-09-18 01:18:48 字數 2966 閱讀 6780

1.使用執行緒池的優點如下:

1.降低資源消耗:通過重複利用已建立的執行緒,降低執行緒建立與銷毀帶來的損耗。

2.提高響應速度:當新任務到達時,任務不需要等待執行緒建立就可以立即執行。

3.提高執行緒的可管理性:使用執行緒池可以統一進行執行緒分配、排程與監控。

當乙個runnable或callable物件到達執行緒池時,執行策略如下:

第一步:

首先判斷核心執行緒池的是否都在執行任務,如果是,再次檢視核心執行緒是否已滿,如果未滿,建立新的執行緒執行任務如果核心執行緒池有空閒執行緒,則將任務直接分配給空閒執行緒執行。否則執行第二步…

第二步:

判斷工作佇列(blockingqueue)是否已滿,如果工作佇列沒有滿,將提交任務儲存到工作佇列中等待核心池的排程;否則若工作佇列已滿,進入第三步…

第三步:

判斷當前執行緒池的執行緒數是否已達到最大值maxiumsize,若已達到最大值,將任務交給飽和策略處理;否則,繼續建立新執行緒執行此任務。

public threadpoolexecutor(int corepoolsize,   --- 1

int maximumpoolsize, --- 3

long keepalivetime, --- 4

timeunit unit, --- 5

blockingqueueworkqueue,---2

rejectedexecutionhandler handler) ---6

1.corepoolsize(核心池的大小):當提交任務到執行緒池時,執行緒池會建立乙個新的執行緒來執行任務,即使核心池中有其他空閒執行緒也會建立新執行緒,一直到執行緒數達到核心池的大小為止。

呼叫prestartallcorethreads()執行緒池會提前建立並啟動所有核心執行緒。

2.workqueue(工作佇列):用於儲存等待執行任務的阻塞佇列。可以選擇以下幾個阻塞佇列。

arrayblockingqueue:基於陣列結構的有界阻塞佇列,次佇列按照fifo原則對元素進行排序。

linkedblockingqueue:基於鍊錶結構的阻塞佇列,按照fifo排序元素,吞吐量高於arrayblockingqueue。

(executors.newfixedthreadpool()採用此佇列。)

synchronousqueue:乙個不儲存元素阻塞佇列。每個插入操作必須等到另乙個執行緒的移除操作,否則,插入操作一直處於阻塞狀態,吞吐量比linkedblockingqueue還要高。

executors.newcachedthreadpool()採用此佇列。

priorityblockingqueue:具有優先順序的無界阻塞佇列。

3.maximumpoolsize(執行緒池最大執行緒數量):執行緒池允許建立的最大執行緒數。如果佇列已滿並且建立的執行緒數小於此引數, 則執行緒池會建立新的執行緒執行任務。否則,呼叫飽和策略處理。如果採用無界佇列,此引數無意義。

4.keepalivetime(執行緒保持活動的時間):執行緒池的工作執行緒空閒後,保持存活的時間。若任務很多,並且每個任務執行的時間較短,可以調大此引數來提高執行緒利用率。

5.timeunit (iv引數的時間單位)

6.rejectedexecutionhandler (飽和策略):當佇列和執行緒池都滿了的情況,說明執行緒池處於飽和狀態。此時,採用飽和策略來處理任務,預設採用abortpolicy。

jdk一共內建4個飽和策略:

abortpolicy,表示無法處理新任務丟擲異常,jdk預設採用此策略。callerrunspolicy,等待呼叫者執行緒空閒後執行此任務。

discardoldestpolicy,丟棄阻塞佇列中最近的乙個任務,並執行當前任務。

discardpolicy,不處理,直接將新任務丟棄,也不報錯。

執行結果:擷取部分足以說明情況。

迴圈5次只建立核心池大小。

以callable為例:

執行結果:

futuretask類執行任務只執行一次,並且會阻塞其他執行緒。

future.get()會阻塞其他執行緒,一直等到當前callable執行緒執行完畢後拿到返回值為止。

J U C執行緒池

執行緒的建立和切換都是代價比較大的。所以,我們需要有乙個好的方案能做到執行緒的復用,這就涉及到乙個概念 執行緒池。合理的使用執行緒池能夠帶來3個很明顯的好處 降低資源消耗 通過重用已經建立的執行緒來降低執行緒建立和銷毀的消耗 提高響應速度 任務到達時不需要等待執行緒建立就可以立即執行。提高執行緒的可...

j u c執行緒 執行緒池

final void runworker worker w catch runtimeexception x catch error x catch throwable x finally finally completedabruptly false finally private runnabl...

多執行緒(九)JUC包下的類

countdownlatch類位於j a.util.concurrent 包下,利用它可以實現類似計數器的功能。比如有乙個任務 a,它要等待其他 4 個任務執行完畢之後才能執行,此時就可以利用 countdownlatch來實現這種功能了。public static void main string...