執行緒池總類以及執行緒池的核心引數簡述

2021-08-29 22:33:02 字數 3201 閱讀 7009

jdk自帶執行緒池總類:

1、newfixedthreadpool建立乙個指定工作執行緒數量的執行緒池。每當提交乙個任務就建立乙個工作執行緒,如果工作執行緒數量達到執行緒池初始的最大數,則將提交的任務存入到池佇列中。

2、newcachedthreadpool建立乙個可快取的執行緒池。這種型別的執行緒池特點是:

1).工作執行緒的建立數量幾乎沒有限制(其實也有限制的,數目為interger.max_value),這樣可靈活的往執行緒池中新增執行緒。

2).如果長時間沒有往執行緒池中提交任務,即如果工作執行緒空閒了指定的時間(預設為1分鐘),則該工作執行緒將自動終止。終止後,如果你又提交了新的任務,則執行緒池重新建立乙個工作執行緒。

3、newsinglethreadexecutor建立乙個單執行緒化的executor,即只建立唯一的工作者執行緒來執行任務,如果這個執行緒異常結束,會有另乙個取代它,保證順序執行(我覺得這點是它的特色)。單工作執行緒最大的特點是可保證順序地執行各個任務,並且在任意給定的時間不會有多個執行緒是活動的。

4、newschedulethreadpool建立乙個定長的執行緒池,而且支援定時的以及週期性的任務執行,類似於timer。(這種執行緒池原理暫還沒完全

了解透徹)

總結:

執行緒池的原理開始初始化若干執行緒處於休眠狀態等待呼叫,不用頻繁建立銷毀減少cpu開支,提公升部分效能。

執行緒池的引數配置詳解

1、threadpoolexecutor的重要引數

corepoolsize:核心執行緒數

核心執行緒會一直存活,及時沒有任務需要執行

當執行緒數小於核心執行緒數時,即使有執行緒空閒,執行緒池也會優先建立新執行緒處理

設定allowcorethreadtimeout=true(預設false)時,核心執行緒會超時關閉

queuecapacity:任務佇列容量(阻塞佇列)

當核心執行緒數達到最大時,新任務會放在佇列中排隊等待執行

maxpoolsize:最大執行緒數

當執行緒數》=corepoolsize,且任務佇列已滿時。執行緒池會建立新執行緒來處理任務

當執行緒數=maxpoolsize,且任務佇列已滿時,執行緒池會拒絕處理任務而丟擲異常

keepalivetime:執行緒空閒時間

當執行緒空閒時間達到keepalivetime時,執行緒會退出,直到執行緒數量=corepoolsize

如果allowcorethreadtimeout=true,則會直到執行緒數量=0

allowcorethreadtimeout:允許核心執行緒超時

rejectedexecutionhandler:任務拒絕處理器

兩種情況會拒絕處理任務:

當執行緒數已經達到maxpoolsize,切佇列已滿,會拒絕新任務

當執行緒池被呼叫shutdown()後,會等待執行緒池裡的任務執行完畢,再shutdown。如果在呼叫shutdown()和執行緒池真正shutdown之間提交任務,會拒絕新任務

執行緒池會呼叫rejectedexecutionhandler來處理這個任務。如果沒有設定預設是abortpolicy,會丟擲異常

threadpoolexecutor類有幾個內部實現類來處理這類情況:

abortpolicy 丟棄任務,拋執行時異常

callerrunspolicy 執行任務

discardpolicy 忽視,什麼都不會發生

discardoldestpolicy 從佇列中踢出最先進入佇列(最後乙個執行)的任務

實現rejectedexecutionhandler介面,可自定義處理器

2、threadpoolexecutor執行順序:

執行緒池按以下行為執行任務

當執行緒數小於核心執行緒數時,建立執行緒。

當執行緒數大於等於核心執行緒數,且任務佇列未滿時,將任務放入任務佇列。

當執行緒數大於等於核心執行緒數,且任務佇列已滿

若執行緒數小於最大執行緒數,建立執行緒

若執行緒數等於最大執行緒數,丟擲異常,拒絕任務

3、如何設定引數

預設值corepoolsize=1

queuecapacity=integer.max_value

maxpoolsize=integer.max_value

keepalivetime=60s

allowcorethreadtimeout=false

rejectedexecutionhandler=abortpolicy()

如何來設定

需要根據幾個值來決定

tasks :每秒的任務數,假設為500~1000

taskcost:每個任務花費時間,假設為0.1s

responsetime:系統允許容忍的最大響應時間,假設為1s

做幾個計算

corepoolsize = 每秒需要多少個執行緒處理?

threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100 個執行緒。corepoolsize設定應該大於50

根據8020原則,如果80%的每秒任務數小於800,那麼corepoolsize設定為80即可

queuecapacity = (coresizepool/taskcost)*responsetime

計算可得 queuecapacity = 80/0.1*1 = 80。意思是佇列裡的執行緒可以等待1s,超過了的需要新開執行緒來執行

切記不能設定為integer.max_value,這樣佇列會很大,執行緒數隻會保持在corepoolsize大小,當任務陡增時,不能新開執行緒來執行,響應時間會隨之陡增。

maxpoolsize = (max(tasks)- queuecapacity)/(1/taskcost)

計算可得 maxpoolsize = (1000-80)/10 = 92

(最大任務數-佇列容量)/每個執行緒每秒處理能力 = 最大執行緒數

rejectedexecutionhandler:根據具體情況來決定,任務不重要可丟棄,任務重要則要利用一些緩衝機制來處理

keepalivetime和allowcorethreadtimeout採用預設通常能滿足

以上都是理想值,實際情況下要根據機器效能來決定。如果在未達到最大執行緒數的情況機器cpu load已經滿了,則需要通過公升級硬體(呵呵)和優化**,降低taskcost來處理。

執行緒池及核心引數

一般來說,執行緒的生命週期需要通過 new 新建 start 就緒 running 執行中 dead 消亡 假設每個狀態到下乙個狀態需要的時間是 1,2,3 秒 但是我們往往只是關心running 那個狀態就可以了,這是執行緒需要執行的任務 使用執行緒池,建立一定數量的執行緒,專門執行任務的run ...

執行緒池的核心執行緒

1 執行緒池的核心執行緒是可以重複利用的 2 當有新任務來的時候,先看看當前的執行緒數有沒有超過核心執行緒數,如果沒超過就直接新建乙個執行緒 核心執行緒 來執行新的任務,如果超過了就看看快取佇列有沒有滿,沒滿就將新任務放進快取佇列中,滿了就新建乙個執行緒 非核心執行緒 來執行新的任務,如果執行緒池中...

執行緒池引數

由於系統頻繁的建立和銷毀執行緒,因而使用執行緒池讓建立的執行緒進行復用 1.corepoolsize 指定了執行緒池中的執行緒數量 2.maximumpoolsize 執行緒池中最大執行緒數量 3.keepalivetime 當執行緒池中的執行緒數超過corepoolsize,多餘的空閒的執行緒的存...