執行緒有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。
private2. shutdown(01) 狀態說明:執行緒池處在shutdown狀態時,不接收新任務,但能處理已新增的任務。final atomicinteger ctl = new atomicinteger(ctlof(running, 0));
(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,discardoldestpolicy和discardpolicy。
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個方面 執行緒池有乙個任務佇列,用於快取所有待處理的任務,一旦開始處理這些任務,這些任務將從任務佇列中刪除,在任...