Executor框架中的執行緒池

2021-08-15 21:27:08 字數 3096 閱讀 1928

執行緒池:

使用執行緒池管理任務,比為每個任務建立執行緒的好處:

1 執行緒池裡的執行緒可以復用,減少了執行緒建立和銷毀的資源開支。

2 執行緒池裡一般存在一部分執行緒,處理任務時候不必去著急建立執行緒,可以提高響應性。

3 合理設定執行緒池裡的執行緒,使伺服器既保持忙碌狀態,又不會因為執行緒過多產生資源競爭導致記憶體耗盡。

執行緒池可以使用executors的靜態工廠方法建立,下面是4種執行緒池:

1 newfixedthreadpool 定長線程池,每提交乙個任務,執行緒池就建立乙個執行緒來啟動任務,直到執行緒池的規模到達指定 大小不再增長,這些執行緒執行完任務後會在任務佇列上等待,這時候再提交任務,任務會儲存到任務佇列,由在任務佇列上等待的執行緒執行任務。

2 newcachedthreadpool 可快取的執行緒池,執行緒池規模極限是2的29次冪-1,提交任務時候,如果任務佇列上沒有等待的執行緒,則建立執行緒執行任務,執行緒執行完任務後在任務佇列上等待60秒。如果有等待的執行緒使用等待的執行緒。

3 newsinglethreadexecutor 執行緒池裡的執行緒數量只有乙個,的定長線程池。

4 newscheduledthreadpool 定長線程池,支援定時執行任務。

推薦使用執行緒池代替thread來執行任務。

executor的生命週期:

執行緒池通常啟動多個執行緒執行任務,而jvm要在所有(非守護)執行緒停止時才會退出,因此正確停止executor,jvm才會正常結束。executor擴充套件了executorservice,這個介面提供了一些方法來操作狀態。

executorservice的生命週期包括:running shutdown stop tidying terminated。executorservice在初始化建立後,進入running 狀態。running 狀態 呼叫shutdown()進入shutdown狀態,不在接收新的任務提交,等待已開的任務以及在任務佇列中未開始的任務執行完畢。running狀態呼叫shutdownnow()方法進入stop狀態,中斷已開執行的任務,不在開啟任務佇列中未開始的任務。在shutdown stop狀態下,若再提交任務,將由拒絕處理處理器來處理任務,丟擲一種異常。在shutdown且任務佇列已經空了或者stop狀態下當工作執行緒數為0時候進入tidying狀態,在tidying狀態,鉤子方法terminated()執行完畢進入terminated狀態。

threadpoolexecutor是乙個靈活可定製執行策略的執行緒池。它繼承abstractexecutorservice,這個抽象類實現了executorservcie介面的部分方法,這個介面繼承executor介面,頂級介面只有乙個execute()方法。使用threadpoolexecutor可以定製各種執行策略的執行緒池,常用的四種執行緒池也是用這個類構造的。

構造

corepoolsize核心池大小:執行緒池裡的執行緒小於它時候建立執行緒,當超過他時候把任務放到任務佇列裡,當任務佇列滿了的時候會執行緒的數量超過他。

maximumpoolsize最大執行緒數,執行緒池執行緒的數量最多為這個值。

keepalivetime空閒時間,執行緒在等待任務時候超過這麼長時間,將會返回然後結束執行緒。預設情況下只有執行緒數超過核心池大小時候,才會用延時的poll獲取任務,等待這麼長時間,沒任務返回null。當設定允許核心池執行緒超時時候,所有執行緒都使用延時poll獲取任務。

unit空閒時間單位。

workqueue任務佇列,當工作執行緒數超過核心池大小時候,把任務放在任務佇列裡面。

threadfactory執行緒工廠,產生工作執行緒。handler拒絕處理策略,丟棄任務,丟擲異常,由提交任務的執行緒處理等。在任務佇列已經滿了或者執行緒池關閉的時候提交任務,會呼叫拒絕處理策略。

執行緒池執行原理:

execute提交任務:如果工作執行緒數目《核心池大小,則建立執行緒啟動任務並返回。如果沒有返回,判斷如果執行緒池是執行中狀態且任務存入任務佇列成功,則再次檢查執行緒池狀態如果不是執行中則移除任務,拒絕處理任務,否則保證至少1個執行緒執行,然後在任務佇列獲取任務來執行。如果執行緒池不是執行中或任務新增到佇列失敗,則嘗試建立1個執行緒啟動任務,如果執行失敗拒絕處理任務。

addwork建立執行緒啟動任務:校驗,如果狀態是stop tidying或terminated校驗不通過;如果狀態是shutdown且首個人任務不為null校驗不通過;如果狀態是shutdown且首個任務為null且任務佇列已經空了校驗不通過;如果工作執行緒數大於執行緒池極限或者根據引數大於核心池或執行緒池最大值校驗不通過。建立工作者執行緒,如果狀態是執行中或者shutdown且首個任務為空,則儲存工作者執行緒並啟動執行緒執行任務,如果啟動失敗則做啟動任務失敗處理。

runworker執行任務:如果首個任務不為空執行首個任務,為空不間斷在任務佇列獲取任務來執行直到獲取到的任務為空,如果執行緒池是stop tidying terminated確保中斷,否則撤銷中斷,執行任務,當獲取的任務為空或拋 出異常後,執行執行任務退出操作。

gettask獲取任務:首先校驗,如果當前是stop tidying terminated狀態返回null,如果是shutdown狀態且任務隊列為空返回null。當設定了允許核心執行緒超時或工作執行緒數超過核心池大小,將使用限時的poll在任務佇列獲取任務,在等待構造器設定的最大空閒時間後獲取不到任務返回null,否則將使用take在任務佇列獲取任務,獲取不到任務會一直等待,直到有執行緒新增了任務。

processworkerexit退出任務:移除工作執行緒,嘗試終止執行緒池,如果執行緒池狀態是執行中或shutdown,判斷如果任務正常結束,會計算乙個最小執行緒數,如果允許核心執行緒超時則為0否則為核心執行緒大小,如果是0若任務佇列非空則為1,如果此時執行緒數大於最小執行緒數直接返回,最後建立乙個首個任務為空的執行緒執行。

addworke***iled啟動任務失敗:移除工作執行緒,嘗試終止執行緒池。

tryterminate嘗試終止執行緒池:首先校驗狀態,只允許shutdown且任務佇列空或stop狀態通過,其他狀態直接返回;再校驗如果工作執行緒數不是0直接則終止乙個空閒執行緒並返回。通過2次校驗後,把執行緒池狀態更新為tidying,然後呼叫鉤子方法terminated(),這是個空方法,我們可以自己實現,完成後,把執行緒池狀態更新為terminated完成關閉。

shutdown關閉執行緒池:修改狀態為shutdown,中斷所有空閒執行緒,嘗試終止執行緒池。

shutodwnnow關閉執行緒池:修改狀態為stop,中斷所有執行緒,嘗試終止執行緒池。

執行緒池框架executor

eexecutor作為靈活且強大的非同步執行框架,其支援多種不同型別的任務執行策略,提供了一種標準的方法將任務的提交過程和執行過程解耦開發,基於生產者 消費者模式,其提交任務的執行緒相當於生產者,執行任務的執行緒相當於消費者,並用runnable來表示任務,executor的實現還提供了對生命週期的...

執行緒池 02 Executor框架

executor 二 executor 的組成 2 任務的執行 3 非同步計算的結果 三 executor 使用 四 executor 主要的類與介面的簡介 2 threadpoolexecutor 3 scheduledthreadpoolexecutor 定時任務類,這裡不討論 4 future...

對Executor的執行緒池框架的理解

對executor的執行緒池框架的理解 1 使用執行緒池的好處 減少執行緒建立 銷毀的開銷 穩定2 executor框架 架構 executor 執行器介面,該介面定義執行runnable任務的方式。executorservice 該介面定義提供對executor的服務。scheduledexecu...