建立threadpoolexecutor可以通過構造方法和executors的靜態方法。
構造方法:
public threadpoolexecutor(intcorepoolsize,
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...