2018-08-06 16:30:37 食魚醬 閱讀數 318更多
threadpoolexecutor是執行緒池類。對於執行緒池,可以通俗的將它理解為」存放一定數量執行緒的乙個執行緒集合。執行緒池允許若個執行緒同時允許,允許同時執行的執行緒數量就是執行緒池的容量;當新增的到執行緒池中的執行緒超過它的容量時,會有一部分執行緒阻塞等待。執行緒池會通過相應的排程策略和拒絕策略,對新增到執行緒池中的執行緒進行管理。
// 阻塞佇列
private final blockingqueueworkqueue;
// 互斥鎖
private final reentrantlock mainlock = new reentrantlock();
// 執行緒集合。乙個worker對應乙個執行緒。
private final hashsetworkers = new hashset();
// 「終止條件」,與「mainlock」繫結。
private final condition termination = mainlock.newcondition();
// 執行緒池中線程數量曾經達到過的最大值。
private int largestpoolsize;
// 已完成任務數量
private long completedtaskcount;
// threadfactory物件,用於建立執行緒。
private volatile threadfactory threadfactory;
// 拒絕策略的處理控制代碼。
private volatile rejectedexecutionhandler handler;
// 保持執行緒存活時間。
private volatile long keepalivetime;
private volatile boolean allowcorethreadtimeout;
// 核心池大小
private volatile int corepoolsize;
// 最大池大小
private volatile int maximumpoolsize;
workers是hashset型別,即它是乙個worker集合。而乙個worker對應乙個執行緒,也就是說執行緒池通過workers包含了」乙個執行緒集合」。當worker對應的執行緒池啟動時,它會執行執行緒池中的任務;當執行完乙個任務後,它會從執行緒池的阻塞佇列中取出乙個阻塞的任務來繼續執行。
wokers的作用是,執行緒池通過它實現了」允許多個執行緒同時執行」。
workqueue是blockingqueue型別,即它是乙個阻塞佇列。當執行緒池中的執行緒數超過它的容量的時候,執行緒會進入阻塞佇列進行阻塞等待。
通過workqueue,執行緒池實現了阻塞功能。
mainlock是互斥鎖,通過mainlock實現了對執行緒池的互斥訪問。
corepoolsize是」核心池大小」,maximumpoolsize是」最大池大小」。它們的作用是調整」執行緒池中實際執行的執行緒的數量」。
例如,當新任務提交給執行緒池時(通過execute方法)。
– 如果此時,執行緒池中執行的執行緒數量< corepoolsize,則建立新執行緒來處理請求。
– 如果此時,執行緒池中執行的執行緒數量》 corepoolsize,但是卻< maximumpoolsize;則僅當阻塞佇列滿時才建立新執行緒。
如果設定的 corepoolsize 和 maximumpoolsize 相同,則建立了固定大小的執行緒池。如果將 maximumpoolsize 設定為基本的無界值(如 integer.max_value),則允許池適應任意數量的併發任務。在大多數情況下,核心池大小和最大池大小的值是在建立執行緒池設定的;但是,也可以使用 setcorepoolsize(int) 和 setmaximumpoolsize(int) 進行動態更改。
poolsize是當前執行緒池的實際大小,即執行緒池中任務的數量。
allowcorethreadtimeout表示是否允許」執行緒在空閒狀態時,仍然能夠存活」;而keepalivetime是當執行緒池處於空閒狀態的時候,超過keepalivetime時間之後,空閒的執行緒會被終止。
threadfactory是threadfactory物件。它是乙個執行緒工廠類,」執行緒池通過threadfactory建立執行緒」。
handler是rejectedexecutionhandler型別。它是」執行緒池拒絕策略」的控制代碼,也就是說」當某任務新增到執行緒池中,而執行緒池拒絕該任務時,執行緒池會通過handler進行相應的處理」。
public void execute(runnable command)
/*2、執行緒池判斷工作佇列是否已滿,如果工作佇列沒有滿,則將新提交的任務儲存在這個工作佇列裡。
如果工作佇列滿了,則進入下個流程。
*/if (isrunning(c) && workqueue.offer(command))
//3、嘗試建立執行緒 注意:此時addworker的第二個引數為false,下面會解釋
else if (!addworker(command, false))
reject(command);
}//該方法用於建立執行緒,注意該方法的第二個引數core
private boolean addworker(runnable firsttask, boolean core)
}boolean workerstarted = false;
boolean workeradded = false;
worker w = null;
try
} finally
if (workeradded)
}} finally
return workerstarted;
}
1、判斷當前的工作執行緒是否小於執行緒池裡的核心執行緒,如果滿足,則建立乙個新的工作執行緒來執行任務。不滿足則進入下個流程。
2、執行緒池判斷工作佇列是否已滿,如果工作佇列沒有滿,則將新提交的任務儲存在這個工作佇列裡。如果工作佇列滿了,則進入下個流程。
3、判斷執行緒池corepoolsize和maximumpoolsize 的差值,如果此時,執行緒池中執行的執行緒數量》 corepoolsize,但是卻< maximumpoolsize,則建立乙個新的工作執行緒來執行任務。如果已經滿了,則交給飽和策略來處理這個任務。
執行緒池原理 JDK1 8原始碼解析
執行緒池建立的方式 public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit,blockingqueueworkqueue,rejectedexecutionhand...
HashMap 底層 原理(JDK 1 8)
原來看過1.7的hashmap底層,1.8更新後也稍微看了一下,沒有進行仔細的總結,今天總結一下1.8底層的原理。本文只討論1.8的底層原理。以下全文為1.8版本的 對於hashmap的資料結構,是老生常談了,面試的時候經常會被問道。底層資料結構為陣列 鍊錶 紅黑樹,儲存的是node節點,紅黑樹是t...
jdk1 8執行緒池 基於原始碼了解工作流程
構造方法 public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit,blockingqueue workqueue,threadfactory threadfacto...