執行緒池ThreadPoolExecutor

2021-08-03 03:44:22 字數 2348 閱讀 4116

在多執行緒環境下,頻繁地建立與銷毀執行緒會耗費大量的系統資源,降低執行效能,因此產生了一種設計思想:將建立好的

執行緒放到乙個容器中,需要時從容器取得執行緒,使用完畢將執行緒歸還容器,這樣就可以重複利用執行緒,避免了重複建立

與銷毀造成的資源消耗,提高了效能。

元素:執行緒。

本質:容器。

設計目的:使得執行緒能夠被重複使用,降低系統消耗。

乙個以多個執行緒為元素、通過重複使用降低系統消耗的容器。

該類是執行緒池思想的核心類,繼承關係如圖。

乙個代表性的構造方法;

public threadpoolexecutor(int corepoolsize,int maximumpoolsize,long

keepalivetime,timeunit unit,

blockingqueue

workqueue,threadfactory threadfactory,rejectedexecutionhandler handler)

核心池大小。這個數字是根據一般情況下併發訪問的執行緒數目設定的。預設情況下,執行緒池建立完

畢後,池中並沒有執行緒,有任務到達以後才開始建立執行緒。

執行緒池中允許出現的最大執行緒數。維護執行緒需要消耗系統資源,最大執行緒數目的設定既考慮高峰時期

最大併發訪問數量,也兼顧了系統效能。

這個引數針對的是超出核心池大小的多餘執行緒。設定乙個時間,如果多餘執行緒空閒時間超過該值,執行緒

會被終止。預設情況下,只有當執行緒數目大於核心池大小時才有效,如果allowcorethreadtimeout設定為true,當執行緒數目

小於核心池大小時也有效。

keepalivetime的單位。

乙個阻塞佇列,用來儲存等待執行的任務。blockingqueue有幾個常用的實現類:

執行緒工廠,用來建立執行緒。

當執行緒數目到達最大值時,拒絕處理任務時採取的策略。

1.當執行緒數目小於核心數目時,每來乙個任務就建立乙個執行緒去執行該任務。

2.當執行緒數目大於等於核心數目時,首先嘗試將新到達的任務新增到任務快取佇列中,若新增成功,等待空閒執行緒執行

該任務,新增失敗嘗試建立新的執行緒處理該任務。

3.如果執行緒達到最大數目,新任務達到時會採取拒絕處理策略。

execute()是threadpoolexecutor的核心方法,下面對該原始碼進行分析:

public

void

execute(runnable command)

//當執行緒數目大於等於corepoolsize時,首先嘗試將任務新增到任務快取佇列中

if (isrunning(c) &&workqueue.offer(command))

//如果任務快取佇列已滿,嘗試建立新的執行緒

else

if (!addworker(command, false

)) reject(command);

}

addworker(runnable firsttask, boolean core)原始碼:

private

boolean addworker(runnable firsttask, boolean

core)

}boolean workerstarted = false

;

boolean workeradded = false

; worker w = null

;

try

finally

return

workerstarted;

}

通常不直接使用threadpoolexecutor的構造方法來建立物件,而是使用executors的靜態方法來建立物件。

newcachedthreadpool();
corepoolsize=0,maximumpoolsize=integer.max_value,keepalivetime=60s,使用synchronousqueue作為任務快取

佇列,如果執行緒池中沒有可用的執行緒,每來乙個任務建立乙個執行緒。

newfixedthreadpool(int nthreads);
corepoolsize=nthreads,maximumpoolsize=nthreads,keepalivetime=0s,使用linkedblockingqueue作為任務快取

佇列。執行緒池執行物件創建立完畢以後,將任務通過execute(runnable command)方法提交給執行緒池執行物件即可。

參考:

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...

mysql 執行緒池 c MySQL執行緒池

mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...