java?線程池狀態(tài)及狀態(tài)轉換
前言:
在 Java 中,線程池的狀態(tài)和線程的狀態(tài)是完全不同的,
線程有 6 種狀態(tài):
- NEW:初始化狀態(tài)、
- RUNNABLE:可運行/運行狀態(tài)、
- BLOCKED:阻塞狀態(tài)、
- WAITING:無時限等待狀態(tài)
- TIMED_WAITING:有時限等待狀態(tài)和
- TERMINATED:終止狀態(tài)。
而線程池的狀態(tài)有以下 5 種:
- RUNNING:運行狀態(tài),線程池創(chuàng)建好之后就會進入此狀態(tài),如果不手動調用關閉方法,那么線程池在整個程序運行期間都是此狀態(tài)。
- SHUTDOWN:關閉狀態(tài),不再接受新任務提交,但是會將已保存在任務隊列中的任務處理完。
- STOP:停止狀態(tài),不再接受新任務提交,并且會中斷當前正在執(zhí)行的任務、放棄任務隊列中已有的任務。
- TIDYING:整理狀態(tài),所有的任務都執(zhí)行完畢后(也包括任務隊列中的任務執(zhí)行完),當前線程池中的活動線程數降為 0 時的狀態(tài)。到此狀態(tài)之后,會調用線程池的 terminated() 方法。
- TERMINATED:銷毀狀態(tài),當執(zhí)行完線程池的 terminated() 方法之后就會變?yōu)榇藸顟B(tài)。
這 5 種狀態(tài)可以在 ThreadPoolExecutor 源碼中找到,如下圖所示:

線程池狀態(tài)轉移
線程池的狀態(tài)轉移有兩條路徑:
- 當調用 shutdown() 方法時,線程池的狀態(tài)會從 RUNNING 到 SHUTDOWN,再到 TIDYING,最后到 TERMENATED 銷毀狀態(tài)。
- 當調用 shutdownNow() 方法時,線程池的狀態(tài)會從 RUNNING 到 STOP,再到 TIDYING,最后到 TERMENATED 銷毀狀態(tài)。
線程狀態(tài)轉換的流程如下圖所示:

terminated方法
線程池中的 terminated() 方法,也就是線程池從 TIDYING 轉換到 TERMINATED 狀態(tài)時調用的方法,默認是空的,
它的源碼如下:

我們可以在創(chuàng)建線程池的時候重寫 terminated() 方法,具體實現代碼如下:
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolStateTransition {
public static void main(String[] args) throws InterruptedException {
// 創(chuàng)建線程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 0L,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(100)) {
@Override
protected void terminated() {
super.terminated();
System.out.println("執(zhí)行 terminated() 方法");
}
};
// 關閉線程池
threadPool.shutdown();
// 等待線程池執(zhí)行完再退出
while (!threadPool.awaitTermination(1, TimeUnit.SECONDS)) {
System.out.println("線程池正在運行中");
}
}
}總結
線程池的狀態(tài)總共有 5 種:RUNNING:運行狀態(tài)、SHUTDOWN:關閉狀態(tài)、STOP:停止狀態(tài)、TIDYING:整理狀態(tài)和 TERMINATED:銷毀狀態(tài)。默認情況下,如果不調用關閉方法,線程池會一直處于 RUNNING 狀態(tài),而線程池狀態(tài)的轉移有兩個路徑:當調用 shutdown() 方法時,線程池的狀態(tài)會從 RUNNING 到 SHUTDOWN,再到 TIDYING,最后到 TERMENATED 銷毀狀態(tài);當調用 shutdownNow() 方法時,線程池的狀態(tài)會從 RUNNING 到 STOP,再到 TIDYING,最后到 TERMENATED 銷毀狀態(tài)。
到此這篇關于java 線程池狀態(tài)及狀態(tài)轉換的文章就介紹到這了,更多相關Java線程池狀態(tài)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Java?ThreadPoolExecutor的拒絕策略
這篇文章主要介紹了Java?ThreadPoolExecutor的拒絕策略,本文對于線程的池的幾種策略進行詳細的講解,在實際的生產中需要集合相關的場景來選擇合適的拒絕策略,需要的朋友可以參考下2022-08-08
Spring Boot 在啟動時進行配置文件加解密的方法詳解
這篇文章主要介紹了Spring Boot 在啟動時進行配置文件加解密的方法,本文通過實例給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
通過自定制LogManager實現程序完全自定義的logger
本章主要闡述怎么完全定制化LogManager來實現應用程序完全自定制的logger,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
Springmvc 4.x利用@ResponseBody返回Json數據的方法
這篇文章主要介紹了Springmvc 4.x利用@ResponseBody返回Json數據的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04

