Java併發 執行緒池原理

2021-08-19 17:57:13 字數 2804 閱讀 3535

執行緒池是j.u.c中乙個非常常用的元件,利於執行緒池技術可以有效利於執行緒資源,避免頻繁的建立和銷毀執行緒造成的系統開銷,避免過多的建立執行緒耗盡系統資源,同時還可以更好對管理執行緒,包括關閉/中斷以及狀態監控等等。

1. 提交任務

2. 核心執行緒數是否已滿

3. 若核心執行緒數已滿,則將任務加入等待佇列,如果沒滿,則建立新的執行緒

4. 任務佇列是否已滿,如果沒滿則將任務加入到等待佇列,如果已滿,則檢視執行緒是否達到最大執行緒數

5. 如果沒有達到最大執行緒數,則建立乙個臨時執行緒執行任務,如果已經達到最大執行緒數,則呼叫拒絕策略拒絕本次提交。

初始化下面看一下jdk中線程池是如何初始化的

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

上面是執行緒池的初始化方法,想理解執行緒池原理,就必須了解這些引數的具體含義。

引數說明

corepoolsize

該引數為執行緒池的核心執行緒數,可以簡單的理解為執行緒池中的執行緒數,當執行緒池中的執行緒沒有達到該數量時,每提交乙個新的任務就會啟動乙個新的執行緒。

maximumpoolsize

該引數為執行緒池的最大執行緒數,當執行緒池中的執行緒數達到核心執行緒數,並且等待佇列已滿時,如果執行緒數沒有達到最大執行緒數,就會再啟動新的執行緒來處理任務,直到達到最大執行緒數。

核心執行緒可以理解為正式員工,(最大執行緒數-核心執行緒數)的執行緒可以理解為臨時員工,當任務被處理完後,臨時員工就會被清退,也就是關閉核心執行緒以外的臨時執行緒。

keepalivetime

該引數指定來臨時員工(臨時執行緒)空閒後的最大存活時間,也就是當臨時執行緒處於空閒狀態後,如果在指定的時間內沒有接收到新的任務,就會被關閉。

unit

該引數指定臨時執行緒存活的時間單位,也就是keepalivetime對應的時間單位。

workqueue

該引數為執行緒池的工作佇列,也可以理解為等待佇列。當執行緒數達到核心執行緒數時,如果此時還有新任務被提交到執行緒池,那麼新進任務會被放到工作佇列中等待,一旦有空閒的核心執行緒,它就會工工作佇列中獲取乙個任務來處理。

threadfactory

執行緒工廠,執行緒池建立執行緒時,不是直接new thread(),而是通過執行緒工廠來建立,這就給來客戶端程式員留出來更好的擴充套件介面,可以通過定製的threadfactory來實現不同的需求。

handler

拒絕策略,當執行緒數已經達到最大執行緒數,並且工作佇列已滿時,此時執行緒池不接收新的任務,jdk提供了以下幾種拒絕策略:

threadpoolexecutor.abortpolicy:丟擲rejectedexecutionexception異常

threadpoolexecutor.callerrunspolicy:將任務拋回給任務提交者執行緒處理

threadpoolexecutor.discardoldestpolicy:拋棄等待時間最長的任務,處理新任務

threadpoolexecutor.discardpolicy:不做任務處理,直接丟棄

public

class

threadpooltest

//定義乙個執行緒工廠,用來為執行緒池建立任務執行緒

private

static

class

mythreadfactory

implements

threadfactory }}

向執行緒池提交任務的方式有兩種

threadpoolexecutor.execute(new runnable() 

});future> future1 = threadpoolexecutor.submit(new runnable() catch (interruptedexception e)

}});

//如果任務沒有完成,則終止

if(!future1.isdone())

futurefuture2 = threadpoolexecutor.submit(new callable()

});//獲取返回值

string rs = future2.get();

執行緒池的關閉方式有兩種,分別是:

這兩種方式的區別在於,shutdownnow()回立即終止正在執行的任務,同時丟棄在工作佇列中等待的任務,而shutdown()則是不接收新的任務,但回等待正在執行的任務和工作佇列中的任務被執行完成後再關閉執行緒池。

執行緒池提供了以下常用的監控指標介面

threadpoolexecutor.gettaskcount();

threadpoolexecutor.getcompletedtaskcount();

threadpoolexecutor.getlargestpoolsize();

threadpoolexecutor.getpoolsize();

threadpoolexecutor.getactivecount();

Java併發22 執行緒池原理

當執行緒池提交乙個新的任務時,執行緒池的處理流程如下 執行緒池判斷核心執行緒池corepoolsize是否已滿 是否都在執行任務 未滿則建立執行緒執行任務 已滿則下一步 執行緒池判斷工作佇列blockingqueue是否已滿,未滿則將任務放進佇列 已滿則下一步 執行緒池判斷池中線程數是否達到maxi...

JAVA併發訪問 執行緒池

1.前言 在乙個 jvm 裡建立太多的執行緒可能會導致系統由於過度消耗記憶體而用完記憶體或 切換過度 為了防止資源不足,伺服器應用程式需要一些辦法來限制任何給定時刻處理的請求數目。2.執行緒池的作用 執行緒池為執行緒生命週期開銷問題和資源不足問題提供了解決方案。通過對多個任務重用執行緒,執行緒建立的...

java併發程式設計 執行緒池

降低資源消耗 提高響應速度 t1 執行緒建立的時間 t2 工作任務執行額時間 t3 執行緒銷毀時間 提高了執行緒的可管理性 corepoolsize 核心執行緒數 如果執行的執行緒數大於核心執行緒數,則會先進入到阻塞佇列裡 maxinumpoolsize 允許最大執行緒數 執行緒池所建立的執行緒數一...