Java執行緒池實現原理

2021-08-13 02:39:53 字數 3398 閱讀 1565

threadpoolexecutor是jdk提供的執行緒池實現,threadpoolexector實現了execturo介面,可以自動幫助使用者建立,銷毀和保護執行緒,先來看一下最基本的使用方式

建立乙個執行緒池

final executor executor = new threadpoolexecutor(10,10,-1, timeunit.milliseconds,new linkedblockingdeque<>(100));
threadpoolexectuor的構造方法

public

threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

這裡先簡單描述一下引數的含義

corepoolesize: 表示核心執行緒數

maximumpoolsize: 表示最大執行緒數,當執行緒數等於corepoolsize的時候,如果繼續提交任務就會建立新的執行緒,直到執行緒數等於maximumpoolsize

keepalivetime:執行緒空閒時間,超過該事件執行緒就會被銷毀掉。

workqueue: 任務佇列,當無法繼續建立執行緒的時候就把任務塞到任務佇列中,可以看做是乙個緩衝區,執行緒池中的執行緒會從該佇列中pool task來執行

執行緒池狀態

private

final atomicinteger ctl = new atomicinteger(ctlof(running, 0));

執行緒池中使用乙個原子物件來儲存當前執行緒池的狀態,當前執行緒池的狀態包括當前執行緒池中線程數量已經當前執行緒池的執行狀態。其中高三位用來描述當前執行緒的執行狀態

private

static

final

int running = -1

<< count_bits;

private

static

final

int shutdown = 0

<< count_bits;

private

static

final

int stop = 1

<< count_bits;

private

static

final

int tidying = 2

<< count_bits;

private

static

final

int terminated = 3

<< count_bits;

剩下的數字用來描述當前執行緒池中線程的數量。

任務提交過程

在使用執行緒池的時候,使用者不需要關心執行緒的建立和銷毀,使用者只需要每次向執行緒池提交任務,下面我們可以看一下使用者提交任務的時候執行緒池都發生了什麼。

public

void

execute(runnable command)

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

else

if (!addworker(command, false)) //新增乙個任務

reject(command);

addworker方法
private

boolean

addworker(runnable firsttask, boolean core)

}boolean workerstarted = false;

boolean workeradded = false;

worker w = null;

try

} finally

if (workeradded)

}} finally

return workerstarted;

}

worker定義
private

final

class

worker

extends

abstractqueuedsynchronizer

implements

runnable

//啟動乙個事件迴圈

public

void

run()

// the value 0 represents the unlocked state.

// the value 1 represents the locked state.

protected

boolean

isheldexclusively()

protected

boolean

tryacquire(int unused)

return

false;

}protected

boolean

tryrelease(int unused)

public

void

lock()

public

boolean

trylock()

public

void

unlock()

public

boolean

islocked()

}

worker簡單實現了aqs框架,在修改worker屬性的時候可以對worker加鎖處理。

runworker方法

runworker實現了乙個事件迴圈,不斷的從workqueue中拉取task,如果拉取的task為null,那麼執行緒就退出

final void runworker(worker w)  catch (runtimeexception x)  catch (error x)  catch (throwable x)  finally 

} finally

}completedabruptly = false;

} finally

}

執行緒池實現原理

上面這幅圖作者表達的不夠完整,作者想通過如下文本來表達內含本質。過程如下 如果請求執行緒小於執行緒池目標執行緒,則執行緒池會新建立執行緒來處理請求 如果請求執行緒數過多,超過了目標執行緒則將請求任務放入佇列中進行緩衝 如果佇列滿了 但未達到最大執行緒池數,這時會新建立執行緒 直到上限為止即maxpo...

執行緒池實現原理

蘑菇街面試,設計乙個執行緒池 入隊非阻塞佇列 當佇列中滿了時候,放入資料,資料丟失 阻塞佇列 當佇列滿了的時候,進行等待,什麼時候佇列中有出隊的資料,那麼第11個再放進去 出隊非阻塞佇列 如果現在佇列中沒有元素,取元素,得到的是null 阻塞佇列 等待,什麼時候放進去,再取出來 執行緒池使用的是阻塞...

java 執行緒池的原理

頻繁地建立執行緒很浪費資源。執行緒池的執行緒可以復用,執行完乙個任務後可以執行另乙個任務。runstate表示當前執行緒池的狀態,它是乙個volatile變數用來保證執行緒之間的可見性 下面的幾個static final變數表示runstate可能的幾個取值。當建立執行緒池後,初始時,執行緒池處於r...