執行緒池引數理解

2021-08-21 03:59:58 字數 2529 閱讀 5733

之前學習的併發知識,現在記錄一下

主要引數說明

執行緒池(threadpoolexecutor),jdk1.5版本開始使用,構造方法引數如下(來自threadpoolexecutor原始碼):

corepoolsize:核心執行緒數,執行緒池啟動時就會建立的執行緒數量。即使核心執行緒是空閒的,也不會被**,除非

呼叫了allowscorethreadtimeout方法為true

executorservice.allowcorethreadtimeout(true);
maximumpoolsize:最大執行緒數,執行緒池中最大的執行緒數量

keepalivetime:執行緒超時時間,看原始碼可知,該引數的意義是執行緒從工作佇列中取出任務的超時時間。其中,timed是指是否設定allowcorethreadtimeout為true,如果沒有設定,則判斷當前執行緒數是否大於核心執行緒數。timeout指的就是執行緒從佇列中取任務是否超時。當乙個執行緒從工作佇列中取任務時,滿足以下條件:(當前執行緒數大於最大執行緒數 或 (timed為true且該執行緒獲取任務超時))&(當前執行緒數大於1 或 工作隊列為空),這個執行緒就會被**。

// are workers subject to culling?

boolean timed = allowcorethreadtimeout || wc > corepoolsize;

if ((wc > maximumpoolsize || (timed && timedout))

&& (wc > 1 || workqueue.isempty()))

unit:超時時間的單位

workqueue:工作佇列,詳情見下面的說明

threadfactory:執行緒工廠,要實現threadfactory介面,執行緒池建立執行緒時會呼叫threadfactory的newthread方法建立執行緒。

rejectedexecutionhandler:飽和策略,詳情見下面的說明

工作佇列

1.執行緒池設定了核心執行緒數(核心執行緒數不為0)

在呼叫excute方法提交任務後,會先判斷當前執行緒池中的執行緒個數,如果當前執行緒數小於核心執行緒數,那麼執行緒池就會建立乙個新的執行緒,執行任務。否則,執行緒池會嘗試將任務放入工作佇列中,如果成功放入,且當前可用執行緒數為0,執行緒池就會建立乙個執行緒,執行任務,否則使用執行緒池中存在的執行緒執行任務。如果放入工作佇列失敗(佇列已滿),並且當前執行緒數大於等於最大執行緒數,就不會再建立執行緒,使用飽和策略拒絕任務,否則就會建立乙個執行緒,接手新提交的任務。

//獲取當前執行緒數量

int c = ctl.get();

//判斷執行緒數量是否小於核心執行緒數,小於則新增執行緒,新新增的執行緒會接手提交的任務

if (workercountof(c) < corepoolsize)

/*嘗試將任務放入佇列中*/

//放入佇列成功

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

//放入佇列失敗,直接建立新的執行緒,接手任務。如果建立執行緒失敗,拒絕任務

else if (!addworker(command, false))

reject(command);

2.執行緒池沒有設定核心執行緒數(核心執行緒數為0)

如果執行緒池沒有設定初始執行緒,在呼叫excute方法後,會直接將任務放入工作佇列,接下來的步驟和1中的一致,這裡不再贅述

當乙個執行緒執行完任務後,會再次從工作佇列中取出任務執行。如果此時工作佇列已經沒有任務了,那麼該執行緒就有可能按照超時時間的邏輯被**,直到當前執行緒數和核心執行緒數一樣時,不再**執行緒,此時執行緒池還是處於執行狀態,等待任務到來。但是,如果設定了allowcorethreadtimeout為true,那麼所有執行緒都會被**,執行緒池自動終止執行。

飽和策略

如果執行緒池中的執行緒數量大於等於最大執行緒數,且工作佇列已滿,新提交的任務就會被拒絕,此時就要使用飽和策略。預設飽和策略是abortpolicy,該策略會丟擲rejectedexecution,呼叫者可以捕獲該異常,編寫處理**。除了預設的飽和策略,還有其他幾種飽和策略:

>discardpolicy:拋棄策略,會悄悄的拋棄沒法加入到佇列的任務

>discardoldestpolicy:拋棄最舊策略,會悄悄的拋棄下乙個要執行的任務。如果使用的是優先佇列,會拋棄優先順序最高的任務,最好不要使用。

>callerrunspolicy:呼叫者執行策略,即不會丟擲異常,也不會放棄執行。任務會被呼叫了execute方法的執行緒呼叫。比如,在main方法中開啟執行緒池,如果執行緒池使用該策略,那麼飽和的任務會被主線程呼叫。

可以使用下面的**設定飽和策略

testthreadpoolexecutor.setrejectedexecutionhandler(new threadpoolexecutor.callerrunspolicy());

backlog引數理解

listen函式把乙個由socket函式建立的套接字轉換成乙個被動套接字,指示核心接受指向該套接字的連線請求。該套接字也由closed狀態轉換到listen狀態。函式原型 include int listen int sockfd,int backlog 成功返回0,失敗返回 1。listen之後核...

電感引數理解

1.電感的q值 電感的q值,也叫做電感的品質因素,是衡量電感器件的主要引數。指電感器在某一頻率的交流電壓工作下,所呈現的感抗與其等效損耗電阻之比。電感器的q值越高,損耗越小,效率越高。電感的q值與線圈導線的直流電阻 線圈骨架的介質損耗及鐵心 遮蔽罩等引起的損耗等有關。2.電感q值的換算 1 q 2p...

Python引數理解

def power x x 必選引數 return x 2def power x,n 2 n 預設引數 return x n即傳入的引數個數是可變的 def calc numbers numbers 可變引數 print numbers sum 0 for n in numbers sum sum ...