溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java concurrency線程池之線程池原理(三)_動力節(jié)點Java學(xué)院整理

發(fā)布時間:2020-09-26 08:18:42 來源:腳本之家 閱讀:128 作者:skywang12345 欄目:編程語言

線程有5種狀態(tài):新建狀態(tài),就緒狀態(tài),運行狀態(tài),阻塞狀態(tài),死亡狀態(tài)。線程池也有5種狀態(tài);然而,線程池不同于線程,線程池的5種狀態(tài)是:Running, SHUTDOWN, STOP, TIDYING, TERMINATED。

線程池狀態(tài)定義代碼如下:

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 << 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;
private static int ctlOf(int rs, int wc) { return rs | wc; }

說明:

ctl是一個AtomicInteger類型的原子對象。ctl記錄了"線程池中的任務(wù)數(shù)量"和"線程池狀態(tài)"2個信息。
ctl共包括32位。其中,高3位表示"線程池狀態(tài)",低29位表示"線程池中的任務(wù)數(shù)量"。

RUNNING    -- 對應(yīng)的高3位值是111。
SHUTDOWN   -- 對應(yīng)的高3位值是000。
STOP       -- 對應(yīng)的高3位值是001。
TIDYING    -- 對應(yīng)的高3位值是010。
TERMINATED -- 對應(yīng)的高3位值是011。 

線程池各個狀態(tài)之間的切換如下圖所示:

Java concurrency線程池之線程池原理(三)_動力節(jié)點Java學(xué)院整理

1. RUNNING

(01) 狀態(tài)說明:線程池處在RUNNING狀態(tài)時,能夠接收新任務(wù),以及對已添加的任務(wù)進行處理。
(02) 狀態(tài)切換:線程池的初始化狀態(tài)是RUNNING。換句話說,線程池被一旦被創(chuàng)建,就處于RUNNING狀態(tài)!
道理很簡單,在ctl的初始化代碼中(如下),就將它初始化為RUNNING狀態(tài),并且"任務(wù)數(shù)量"初始化為0。

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

 2. SHUTDOWN

(01) 狀態(tài)說明:線程池處在SHUTDOWN狀態(tài)時,不接收新任務(wù),但能處理已添加的任務(wù)。
(02) 狀態(tài)切換:調(diào)用線程池的shutdown()接口時,線程池由RUNNING -> SHUTDOWN。

 3. STOP

(01) 狀態(tài)說明:線程池處在STOP狀態(tài)時,不接收新任務(wù),不處理已添加的任務(wù),并且會中斷正在處理的任務(wù)。
(02) 狀態(tài)切換:調(diào)用線程池的shutdownNow()接口時,線程池由(RUNNING or SHUTDOWN ) -> STOP。

 4. TIDYING

(01) 狀態(tài)說明:當(dāng)所有的任務(wù)已終止,ctl記錄的"任務(wù)數(shù)量"為0,線程池會變?yōu)門IDYING狀態(tài)。當(dāng)線程池變?yōu)門IDYING狀態(tài)時,會執(zhí)行鉤子函數(shù)terminated()。terminated()在ThreadPoolExecutor類中是空的,若用戶想在線程池變?yōu)門IDYING時,進行相應(yīng)的處理;可以通過重載terminated()函數(shù)來實現(xiàn)。
(02) 狀態(tài)切換:當(dāng)線程池在SHUTDOWN狀態(tài)下,阻塞隊列為空并且線程池中執(zhí)行的任務(wù)也為空時,就會由 SHUTDOWN -> TIDYING。
當(dāng)線程池在STOP狀態(tài)下,線程池中執(zhí)行的任務(wù)為空時,就會由STOP -> TIDYING。

 5. TERMINATED

(01) 狀態(tài)說明:線程池徹底終止,就變成TERMINATED狀態(tài)。
(02) 狀態(tài)切換:線程池處在TIDYING狀態(tài)時,執(zhí)行完terminated()之后,就會由 TIDYING -> TERMINATED。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI