1.使用執行緒池的優點如下:
1.降低資源消耗:通過重複利用已建立的執行緒,降低執行緒建立與銷毀帶來的損耗。
2.提高響應速度:當新任務到達時,任務不需要等待執行緒建立就可以立即執行。
3.提高執行緒的可管理性:使用執行緒池可以統一進行執行緒分配、排程與監控。當乙個runnable或callable物件到達執行緒池時,執行策略如下:
第一步:
首先判斷核心執行緒池的是否都在執行任務,如果是,再次檢視核心執行緒是否已滿,如果未滿,建立新的執行緒執行任務如果核心執行緒池有空閒執行緒,則將任務直接分配給空閒執行緒執行。否則執行第二步…第二步:判斷工作佇列(blockingqueue)是否已滿,如果工作佇列沒有滿,將提交任務儲存到工作佇列中等待核心池的排程;否則若工作佇列已滿,進入第三步…第三步:判斷當前執行緒池的執行緒數是否已達到最大值maxiumsize,若已達到最大值,將任務交給飽和策略處理;否則,繼續建立新執行緒執行此任務。1.corepoolsize(核心池的大小):當提交任務到執行緒池時,執行緒池會建立乙個新的執行緒來執行任務,即使核心池中有其他空閒執行緒也會建立新執行緒,一直到執行緒數達到核心池的大小為止。public threadpoolexecutor(int corepoolsize, --- 1
int maximumpoolsize, --- 3
long keepalivetime, --- 4
timeunit unit, --- 5
blockingqueueworkqueue,---2
rejectedexecutionhandler handler) ---6
呼叫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...