Java concurrency線程池之線程池原理(三)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
線程有5種狀態(tài):新建狀態(tài),就緒狀態(tài),運(yùn)行狀態(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是一個(gè)AtomicInteger類型的原子對(duì)象。ctl記錄了"線程池中的任務(wù)數(shù)量"和"線程池狀態(tài)"2個(gè)信息。
ctl共包括32位。其中,高3位表示"線程池狀態(tài)",低29位表示"線程池中的任務(wù)數(shù)量"。
RUNNING -- 對(duì)應(yīng)的高3位值是111。
SHUTDOWN -- 對(duì)應(yīng)的高3位值是000。
STOP -- 對(duì)應(yīng)的高3位值是001。
TIDYING -- 對(duì)應(yīng)的高3位值是010。
TERMINATED -- 對(duì)應(yīng)的高3位值是011。
線程池各個(gè)狀態(tài)之間的切換如下圖所示:

1. RUNNING
(01) 狀態(tài)說明:線程池處在RUNNING狀態(tài)時(shí),能夠接收新任務(wù),以及對(duì)已添加的任務(wù)進(jìn)行處理。
(02) 狀態(tài)切換:線程池的初始化狀態(tài)是RUNNING。換句話說,線程池被一旦被創(chuàng)建,就處于RUNNING狀態(tài)!
道理很簡(jiǎn)單,在ctl的初始化代碼中(如下),就將它初始化為RUNNING狀態(tài),并且"任務(wù)數(shù)量"初始化為0。
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
2. SHUTDOWN
(01) 狀態(tài)說明:線程池處在SHUTDOWN狀態(tài)時(shí),不接收新任務(wù),但能處理已添加的任務(wù)。
(02) 狀態(tài)切換:調(diào)用線程池的shutdown()接口時(shí),線程池由RUNNING -> SHUTDOWN。
3. STOP
(01) 狀態(tài)說明:線程池處在STOP狀態(tài)時(shí),不接收新任務(wù),不處理已添加的任務(wù),并且會(huì)中斷正在處理的任務(wù)。
(02) 狀態(tài)切換:調(diào)用線程池的shutdownNow()接口時(shí),線程池由(RUNNING or SHUTDOWN ) -> STOP。
4. TIDYING
(01) 狀態(tài)說明:當(dāng)所有的任務(wù)已終止,ctl記錄的"任務(wù)數(shù)量"為0,線程池會(huì)變?yōu)門IDYING狀態(tài)。當(dāng)線程池變?yōu)門IDYING狀態(tài)時(shí),會(huì)執(zhí)行鉤子函數(shù)terminated()。terminated()在ThreadPoolExecutor類中是空的,若用戶想在線程池變?yōu)門IDYING時(shí),進(jìn)行相應(yīng)的處理;可以通過重載terminated()函數(shù)來實(shí)現(xiàn)。
(02) 狀態(tài)切換:當(dāng)線程池在SHUTDOWN狀態(tài)下,阻塞隊(duì)列為空并且線程池中執(zhí)行的任務(wù)也為空時(shí),就會(huì)由 SHUTDOWN -> TIDYING。
當(dāng)線程池在STOP狀態(tài)下,線程池中執(zhí)行的任務(wù)為空時(shí),就會(huì)由STOP -> TIDYING。
5. TERMINATED
(01) 狀態(tài)說明:線程池徹底終止,就變成TERMINATED狀態(tài)。
(02) 狀態(tài)切換:線程池處在TIDYING狀態(tài)時(shí),執(zhí)行完terminated()之后,就會(huì)由 TIDYING -> TERMINATED。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java.lang.IllegalStateException:方法有太多主體參數(shù)問題
這篇文章主要介紹了java.lang.IllegalStateException:方法有太多主體參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
springBoot集成Elasticsearch 報(bào)錯(cuò) Health check failed的解決
這篇文章主要介紹了springBoot集成Elasticsearch 報(bào)錯(cuò) Health check failed的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot整合log4j日志與HashMap的底層原理解析
這篇文章主要介紹了SpringBoot整合log4j日志與HashMap的底層原理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Spring @Primary和@Qualifier注解原理解析
這篇文章主要介紹了Spring @Primary和@Qualifier注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
使用Springboot打成jar包thymeleaf的問題
這篇文章主要介紹了使用Springboot打成jar包thymeleaf的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java class文件格式總結(jié)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java class文件格式總結(jié)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-06-06
Java大小寫轉(zhuǎn)換及一些常見的注意事項(xiàng)詳解
這篇文章主要介紹了Java大小寫轉(zhuǎn)換及一些常見的注意事項(xiàng)的相關(guān)資料,Java提供了多種方法進(jìn)行大小寫轉(zhuǎn)換,包括String類的toLowerCase和toUpperCase方法,以及Character類的toLowerCase和toUpperCase方法,需要的朋友可以參考下2025-02-02
spring?webClient配置及使用簡(jiǎn)單代碼示例
WebClient是Spring框架5.0引入的基于響應(yīng)式編程模型的HTTP客戶端,它提供一種簡(jiǎn)便的方式來處理HTTP請(qǐng)求和響應(yīng),支持異步和非阻塞式的請(qǐng)求和響應(yīng)處理,下面這篇文章主要給大家介紹了關(guān)于spring?webClient配置及使用的相關(guān)資料,需要的朋友可以參考下2024-03-03
Java中BeanUtils.copyProperties的11個(gè)坑總結(jié)
我們?nèi)粘i_發(fā)中,經(jīng)常涉及到DO、DTO、VO對(duì)象屬性拷貝賦值,很容易想到org.springframework.beans.BeanUtils的copyProperties,它會(huì)自動(dòng)通過反射機(jī)制獲取源對(duì)象和目標(biāo)對(duì)象的屬性,pyProperties,會(huì)有好幾個(gè)坑呢,本文將給大家總結(jié)一下遇到的坑,需要的朋友可以參考下2023-05-05

