執行緒池幾種配置引數的理解

2022-03-07 14:13:48 字數 1678 閱讀 9785

建立threadpoolexecutor可以通過構造方法和executors的靜態方法。

構造方法:

public threadpoolexecutor(int

corepoolsize,

intmaximumpoolsize,

long

keepalivetime,

timeunit unit,

blockingqueue

workqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

corepoolsize,執行緒池裡最小執行緒數

maximumpoolsize,執行緒池裡最大執行緒數量,超過最大執行緒時候會使用rejectedexecutionhandler

keepalivetime,unit,執行緒最大的存活時間

workerqueue,快取非同步任務的佇列

threadfactory,用來構造執行緒池裡的worker執行緒

執行緒池提交任務流程,以下**有簡化

runnable command

if (workercount < corepoolsize) else if (!addworker(command)) { //還沒達到maximumpoolsize,建立worker並執行

handler.rejectedexception(command)

執行緒池中線程不足corepoolsize的時候直接建立執行緒執行command,不然的話提交到佇列,其他worker會對這個佇列做poll。

當workerqueue佇列滿了的時候,會建立新的worker,如果worker達到上限會呼叫handler.rejectedexception方法。

executors.newcachedthreadpool

core是0,max是無限,佇列是synchronousqueue。無限建立執行緒,執行緒60s過期被銷毀。風險點是執行緒數不可控。

executors.newfixedthreadpool

core是thread數量,max是thread數量,佇列是linkedblockingqueue。因為linkedblockingqueue是無界的,所以max不會起作用。風險點是workerqueue的長度不可控

關於threadpoolexecutor.discardpolicy和threadpoolexecutor.callerrunspolicy

乙個是佇列慢了就丟棄。乙個是佇列滿了就使用主線程來執行,變成同步呼叫的方式。主線程就是呼叫submit方法的執行緒。

我的任務是請求外部http鏈結,且允許失敗,我希望不要影響其他執行緒。

使用執行緒池的引數:

new threadpoolexecutor(

10, 100, 60, timeunit.seconds,                   //限制最大執行緒,如果是cpu密集型的任務,核心執行緒就用核數,最大執行緒就用核數的n倍

new arrayblockingqueue(1000),  //固定大小,防止記憶體堆積過多

new namedthreadfactory("third_retrieval"),  //自己的threadfactory

new threadpoolexecutor.discardpolicy())        //當任務對接的時候直接丟棄

執行緒池引數理解

之前學習的併發知識,現在記錄一下 主要引數說明 執行緒池 threadpoolexecutor jdk1.5版本開始使用,構造方法引數如下 來自threadpoolexecutor原始碼 corepoolsize 核心執行緒數,執行緒池啟動時就會建立的執行緒數量。即使核心執行緒是空閒的,也不會被 除...

Java執行緒池幾個引數的理解

執行緒池幾個引數的理解 比如去火車站買票,有10個售票視窗,但只有5個視窗對外開放.那麼對外開放的5個視窗稱為核心執行緒數,而最大執行緒數是10個視窗.如果5個視窗都被占用,那麼後來的人就必須在後面排隊,但後來售票廳人越來越多,已經人滿為患,就類似於執行緒佇列已滿.這時候火車站站長下令,把剩下的5個...

執行緒核心引數? 如何合理配置執行緒池引數?

預設配置 corepoolsize 1 queuecapacity integer.max value maxpoolsize integer.max value keepalivetime 60秒 allowcorethreadtimeout false rejectedexecutionhand...