之前學習的併發知識,現在記錄一下
主要引數說明
執行緒池(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 ...