91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

java線程池狀態有哪些及狀態轉換實例分析

發布時間:2022-05-10 14:21:27 來源:億速云 閱讀:134 作者:zzz 欄目:開發技術

這篇文章主要介紹“java線程池狀態有哪些及狀態轉換實例分析”,在日常操作中,相信很多人在java線程池狀態有哪些及狀態轉換實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java線程池狀態有哪些及狀態轉換實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

前言:

在 Java 中,線程池的狀態和線程的狀態是完全不同的,

線程有 6 種狀態:

  • NEW:初始化狀態、

  • RUNNABLE:可運行/運行狀態、

  • BLOCKED:阻塞狀態、

  • WAITING:無時限等待狀態

  • TIMED_WAITING:有時限等待狀態和

  • TERMINATED:終止狀態。

而線程池的狀態有以下 5 種:

  • RUNNING:運行狀態,線程池創建好之后就會進入此狀態,如果不手動調用關閉方法,那么線程池在整個程序運行期間都是此狀態。

  • SHUTDOWN:關閉狀態,不再接受新任務提交,但是會將已保存在任務隊列中的任務處理完。

  • STOP:停止狀態,不再接受新任務提交,并且會中斷當前正在執行的任務、放棄任務隊列中已有的任務。

  • TIDYING:整理狀態,所有的任務都執行完畢后(也包括任務隊列中的任務執行完),當前線程池中的活動線程數降為 0 時的狀態。到此狀態之后,會調用線程池的 terminated() 方法。

  • TERMINATED:銷毀狀態,當執行完線程池的 terminated() 方法之后就會變為此狀態。

這 5 種狀態可以在 ThreadPoolExecutor 源碼中找到,如下圖所示: 

java線程池狀態有哪些及狀態轉換實例分析

線程池狀態轉移

線程池的狀態轉移有兩條路徑:

  • 當調用 shutdown() 方法時,線程池的狀態會從 RUNNING 到 SHUTDOWN,再到 TIDYING,最后到 TERMENATED 銷毀狀態。

  • 當調用 shutdownNow() 方法時,線程池的狀態會從 RUNNING 到 STOP,再到 TIDYING,最后到 TERMENATED 銷毀狀態。

線程狀態轉換的流程如下圖所示: 

java線程池狀態有哪些及狀態轉換實例分析

terminated方法

線程池中的 terminated() 方法,也就是線程池從 TIDYING 轉換到 TERMINATED 狀態時調用的方法,默認是空的,

它的源碼如下: 

java線程池狀態有哪些及狀態轉換實例分析

我們可以在創建線程池的時候重寫 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 {
        // 創建線程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 0L,
                TimeUnit.SECONDS, new LinkedBlockingQueue<>(100)) {
            @Override
            protected void terminated() {
                super.terminated();
                System.out.println("執行 terminated() 方法");
            }
        };
        // 關閉線程池
        threadPool.shutdown();
        // 等待線程池執行完再退出
        while (!threadPool.awaitTermination(1, TimeUnit.SECONDS)) {
            System.out.println("線程池正在運行中");
        }
    }
}

到此,關于“java線程池狀態有哪些及狀態轉換實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

电白县| 安化县| 穆棱市| 百色市| 怀仁县| 屯门区| 腾冲县| 太康县| 藁城市| 和田市| 林周县| 响水县| 福贡县| 上思县| 吴忠市| 合肥市| 陈巴尔虎旗| 美姑县| 娱乐| 龙南县| 广安市| 乐亭县| 乐平市| 德庆县| 灵川县| 桂平市| 长葛市| 资阳市| 兰州市| 涞水县| 长治市| 五家渠市| 山东| 绥阳县| 汶上县| 积石山| 鄯善县| 叙永县| 绥芬河市| 任丘市| 长葛市|