執行緒池的生命週期和拒絕策略

2021-07-02 22:48:38 字數 2813 閱讀 3145

執行緒有5種狀態:新建狀態,就緒狀態,執行狀態,阻塞狀態,死亡狀態。執行緒池也有5種狀態;

然而,執行緒池不同於執行緒,執行緒池的5種狀態是:running, shutdown, stop, tidying, terminated。

執行緒池狀態定義**如下:

private

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

private

static

final

int count_bits = integer.size - 3;

private

static

final

int capacity = (1 << count_bits) - 1;

private

static

final

int running = -1 <

private

static

final

int shutdown = 0 <

private

static

final

int stop = 1 <

private

static

final

int tidying = 2 <

private

static

final

int terminated = 3 <

private

static

int ctlof(int rs, int wc)

說明

ctl是乙個atomicinteger型別的原子物件。ctl記錄了"執行緒池中的任務數量"和"執行緒池狀態"2個資訊。

ctl共包括32位。其中,高3位表示"執行緒池狀態",低29位表示"執行緒池中的任務數量"。

running--對應的高3位值是111。

shutdown--對應的高3位值是000。

stop--對應的高3位值是001。

tidying--對應的高3位值是010。

terminated-- 對應的高3位值是011。

執行緒池各個狀態之間的切換如下圖所示:

(01) 狀態說明:執行緒池處在running狀態時,能夠接收新任務,以及對已新增的任務進行處理。

(02) 狀態切換:執行緒池的初始化狀態是running。換句話說,執行緒池被一旦被建立,就處於running狀態!

道理很簡單,在ctl的初始化**中(如下),就將它初始化為running狀態,並且"任務數量"初始化為0。

private

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

2. shutdown(01) 狀態說明:執行緒池處在shutdown狀態時,不接收新任務,但能處理已新增的任務。

(02) 狀態切換:呼叫執行緒池的shutdown()介面時,執行緒池由running -> shutdown。

3. stop

(01) 狀態說明:執行緒池處在stop狀態時,不接收新任務,不處理已新增的任務,並且會中斷正在處理的任務。

(02) 狀態切換:呼叫執行緒池的shutdownnow()介面時,執行緒池由(running or shutdown ) -> stop。

4. tidying

(02) 狀態切換:當執行緒池在shutdown狀態下,阻塞隊列為空並且執行緒池中執行的任務也為空時,就會由 shutdown -> tidying。

當執行緒池在stop狀態下,執行緒池中執行的任務為空時,就會由stop -> tidying。

5. terminated

(01) 狀態說明:執行緒池徹底終止,就變成terminated狀態。

(02) 狀態切換:執行緒池處在tidying狀態時,執行完terminated()之後,就會由 tidying -> terminated。

執行緒池的拒絕策略,是指當任務新增到執行緒池中被拒絕,而採取的處理措施。

當任務新增到執行緒池中之所以被拒絕,可能是由於:第一,執行緒池異常關閉。第二,任務數量超過執行緒池的最大限制。

執行緒池共包括4種拒絕策略,它們分別是:abortpolicy,callerrunspolicy,discardoldestpolicydiscardpolicy

abortpolicy--當任務新增到執行緒池中被拒絕時,它將丟擲 rejectedexecutionexception 異常。callerrunspolicy    discardoldestpolicy--當任務新增到執行緒池中被拒絕時,執行緒池會放棄等待佇列中最舊的未處理任務,然後將被拒絕的任務新增到等待佇列中。discardpolicy-- 當任務新增到執行緒池中被拒絕時,執行緒池將丟棄被拒絕的任務。
執行緒池預設的處理策略是abortpolicy!

[ [

執行緒池拒絕策略

手寫執行緒池拒絕策略 執行緒池的引數 預設策略 預設 拒絕策略 丟擲異常 程式崩潰 第二種策略 執行緒從哪來 回哪去 這個 用力 將 executorservice exec newthreadpoolexecutor 1 2,30 timeunit.microseconds,newarrayblo...

執行緒池拒絕策略

public void rejectedexecution runnable r,threadpoolexecutor e 丟擲異常表明哪個任務在哪個執行緒池中執行失敗了 public void rejectedexecution runnable r,threadpoolexecutor e 如果...

執行緒池的拒絕策略

今天我自己整理了一下threadpoolexector的最後乙個引數 拒絕策略 當新到的任務數量已經超過了系統實際能夠承載的能力時,就會觸發拒絕策略,這是系統超負荷執行的補救措施具體以下3個方面 執行緒池有乙個任務佇列,用於快取所有待處理的任務,一旦開始處理這些任務,這些任務將從任務佇列中刪除,在任...