多執行緒 執行緒池

2021-08-30 08:44:13 字數 3227 閱讀 8049

第一:降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。

第二:提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。

第三:提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立,不僅會消耗系統資源, 還會降低系統的穩定性,使用執行緒池可以進行統一分配、調優和監控。

當提交乙個新任務到執行緒池時,執行緒池的處理流程:

1)執行緒池判斷核心執行緒池裡的執行緒是否都在執行任務。如果不是,則建立乙個新的工作 執行緒來執行任務。如果核心執行緒池裡的執行緒都在執行任務,則進入下個流程。

2)執行緒池判斷工作佇列是否已經滿。如果工作佇列沒有滿,則將新提交的任務儲存在這 個工作佇列裡。如果工作佇列滿了,則進入下個流程。

3)執行緒池判斷執行緒池的執行緒是否都處於工作狀態。如果沒有,則建立乙個新的工作執行緒 來執行任務。如果已經滿了,則交給飽和策略來處理這個任務。

threadpoolexecutor執行execute方法分下面4種情況。

1)如果當前執行的執行緒少於corepoolsize,則建立新執行緒來執行任務(注意,執行這一步驟 需要獲取全域性鎖)。

2)如果執行的執行緒等於或多於corepoolsize,則將任務加入blockingqueue。

3)如果無法將任務加入blockingqueue(佇列已滿),則建立新的執行緒來處理任務(注意,執 行這一步驟需要獲取全域性鎖)。

4)如果建立新執行緒將使當前執行的執行緒超出maximumpoolsize,任務將被拒絕,並呼叫 rejectedexecutionhandler.rejectedexecution()方法。

原始碼:

public void execute(runnable command) 

// 如果執行緒池不處於執行中或任務無法放入佇列,並且當前執行緒數量小於最大允許的執行緒數量,

// 則建立乙個執行緒執行任務。

else if (!addifundermaximumpoolsize(command))

// 丟擲rejectedexecutionexception異常

reject(command); // is shutdown or saturated}}

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

引數含義如下:

1、corepoolsize 核心執行緒池大小;2、maximumpoolsize 執行緒池最大容量大小;3、keepalivetime 執行緒池空閒時,執行緒存活的時間;4、timeunit 時間單位;5、threadfactory 執行緒工廠;6、blockingqueue 任務佇列;7、rejectedexecutionhandler 執行緒拒絕策略;

當我們提交乙個新的任務到執行緒池,執行緒池會根據當前池中正在執行的執行緒數量來決定該任務的處理方式。處理方式有三種: 1、直接切換(synchronusqueue)

2、無界佇列(linkedblockingqueue)能夠建立的最大執行緒數為corepoolsize,這時maximumpoolsize就不會起作用了。當執行緒池中所有的核心執行緒都是執行狀態的時候,新的任務提交就會放入等待佇列中。

3、有界佇列(arrayblockingqueue)最大maximumpoolsize,能夠降低資源消耗,但是這種方式使得執行緒池對執行緒排程變的更困難。因為執行緒池與佇列容量都是有限的。所以想讓執行緒池的吞吐率和處理任務達到乙個合理的範圍,又想使我們的執行緒排程相對簡單,並且還盡可能降低資源的消耗,我們就需要合理的限制這兩個數量

分配技巧: 如果想降低資源的消耗包括降低cpu使用率、作業系統資源的消耗、上下文切換的開銷等等,可以設定乙個較大的佇列容量和較小的執行緒池容量,這樣會降低執行緒池的吞吐量。如果我們提交的任務經常發生阻塞,我們可以調整maximumpoolsize。如果我們的佇列容量較小,我們需要把執行緒池大小設定的大一些,這樣cpu的使用率相對來說會高一些。但是如果執行緒池的容量設定的過大,提高任務的數量過多的時候,併發量會增加,那麼執行緒之間的排程就是乙個需要考慮的問題。這樣反而可能會降低處理任務的吞吐量。

5、rejectedexecutionhandler 執行緒拒絕策略:

newcachedthreadpool:

public static executorservice newcachedthreadpool()
newfixedthreadpool:

public static executorservice newfixedthreadpool(int nthreads)
newsinglethreadexecutor:

public static executorservice newsinglethreadexecutor()
newscheduledthreadpool:

//原始碼:

public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize)

​ public scheduledthreadpoolexecutor(int corepoolsize)

基礎資料excel匯入多表操作;場景說明:excel匯入基礎資料,得到的匯入資料list需要插入到a表、b表。由於基礎資料動輒上萬條資料,如果只是使用單執行緒進行匯入,時間周期長,系統效能會大大降低。解決方法:使用使用自定義執行緒池,設定了多執行緒,每個執行緒對list進行分組,分組後依次插入到資料庫a、b表中。

多執行緒 執行緒池

執行緒池是什麼 執行緒池 thread pool 是一種基於池化思想管理執行緒的工具,經常出現在多執行緒伺服器中,如mysql。執行緒過多會帶來額外的開銷,其中包括建立銷毀執行緒的開銷 排程執行緒的開銷等等,同時也降低了計算機的整體效能。執行緒池維護多個執行緒,等待監督管理者分配可併發執行的任務。這...

多執行緒 執行緒池

執行緒池的作用 減少了每次建立 銷毀執行緒所帶來的損耗。執行緒池建立執行緒的簡易流程 文字描述 1 先判斷核心執行緒池 corepoolsize 是否已滿,沒滿就建立核心執行緒執行,滿了就進行下一判斷。2 判斷等待佇列 workqueue 是否已經滿了,沒滿就新增到等待佇列,滿了就進行下一判斷。3 ...

多執行緒 執行緒池

executors.newfixedthreadpool int 建立乙個固定執行緒數的執行緒池,其最大執行緒數跟核心執行緒數一樣大。使用linkblockingqueue.public static executorservice newfixedthreadpool int nthreads e...