疏漏總結(八) 執行緒池

2021-10-04 12:12:17 字數 1306 閱讀 8319

先從構造方法裡面的引數開始說。

corepoolsize:核心執行緒數

核心執行緒是一定會存在著的執行緒,也就是說,如果你設定了假如說5,那麼不管這五個執行緒有沒有任務,都會被建立出來。

queuecapacity:阻塞佇列

當核心執行緒數被使用到了最大值後,新任務如果還需要建立執行緒,就會進入阻塞佇列,等前面的執行緒執行結束重新放入執行緒池後,才會繼續建立執行緒。

maxpoolsize:最大執行緒數

如果已達到核心執行緒數,佇列也滿了,就會創造新執行緒去執行任務,如果算上新執行緒數,已經到達了最大執行緒數,就會報錯,觸發拒絕策略。

keepalivetime:執行緒空閒時間

超過空閒時間,多餘的執行緒就會回到執行緒池,減少到核心執行緒數的大小,如果allowcorethreadtimeout設定為true,那麼最小可以減少到0

allowcorethreadtimeout:允許執行緒超時

看4rejectedexecutionhandler:任務拒絕處理器

主要描述的拒絕策略:

①當佇列滿了,最大執行緒數也到了,就會觸發拒絕策略。

②呼叫shutdown也會執行拒絕策略,但是會先把手頭的活幹完。

觸發拒絕策略會如何:

①預設是直接報exception

②丟棄任務,拋runtimeexception

③執行任務

④無視任務

⑤剔除佇列中最先進入佇列的任務

⑥rejectedexecutionhandler介面實現,自定義處理方法

執行緒池的執行順序:

①首先建立執行緒到核心數量

②核心數量滿了,多餘的放進阻塞佇列

③阻塞佇列滿了,但是還沒到最大執行緒數,繼續建立執行緒

④佇列滿了也達到最大執行緒數了,觸發拒絕策略

執行緒池引數設定場景

併發量大,但是任務周期短

執行緒池執行緒數可以設定為cpu核數+1,減少執行緒上下文的切換

併發不高,但是任務周期長

假如是業務時間長集中在io操作上,也就是io密集型的任務,因為io操作並不占用cpu,所以不要讓所有的cpu閒下來,可以適當加大執行緒池中的執行緒數目(2 * cpu核數),讓cpu處理更多的業務。

假如是業務時間長集中在計算操作上,也就是cpu密集型任務,執行緒數設定成cpu核數+1就好,執行緒池中的執行緒數設定得少一些,減少執行緒上下文的切換

Java併發程式設計八 執行緒池

1.降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。2.提高響應速度。當任務到達時,任務可以不需要的等到執行緒建立就能立即執行。3.提高執行緒的可管理性。執行緒是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一的分配,調優和監控。...

JUC(八) 執行緒池深入講解

juc 一 locks juc 二 深入理解鎖機制 juc 三 執行緒安全類 juc 四 強大的輔助類講解 juc 五 callable juc 六 阻塞佇列 juc 七 執行緒池簡單使用 juc 八 執行緒池深入講解 3 當乙個執行緒完成任務時,它會從佇列中取下乙個任務來執行。4 當乙個執行緒無事...

Dubbo(八)執行緒模型

dubbo有兩種執行緒池,第一種是i o執行緒池,第二種是業務執行緒池。i o執行緒池主要是收包發包,接收新的連線,業務執行緒則是執行我們的業務 呼叫介面的實現類 i o執行緒數預設是cpu的個數 1,業務執行緒數預設是200。與其他半同步半非同步的模型相似,dubbo的業務執行緒池也配備了佇列,不...