執行緒池原理(JDK1 8)

2022-02-14 17:43:51 字數 3139 閱讀 8414

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...