溫馨提示×

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

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

java線程池狀態(tài)有哪些及狀態(tài)轉(zhuǎn)換實(shí)例分析

發(fā)布時(shí)間:2022-05-10 14:21:27 來(lái)源:億速云 閱讀:126 作者:zzz 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“java線程池狀態(tài)有哪些及狀態(tài)轉(zhuǎn)換實(shí)例分析”,在日常操作中,相信很多人在java線程池狀態(tài)有哪些及狀態(tài)轉(zhuǎn)換實(shí)例分析問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java線程池狀態(tài)有哪些及狀態(tài)轉(zhuǎn)換實(shí)例分析”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

前言:

在 Java 中,線程池的狀態(tài)和線程的狀態(tài)是完全不同的,

線程有 6 種狀態(tài):

  • NEW:初始化狀態(tài)、

  • RUNNABLE:可運(yùn)行/運(yùn)行狀態(tài)、

  • BLOCKED:阻塞狀態(tài)、

  • WAITING:無(wú)時(shí)限等待狀態(tài)

  • TIMED_WAITING:有時(shí)限等待狀態(tài)和

  • TERMINATED:終止?fàn)顟B(tài)。

而線程池的狀態(tài)有以下 5 種:

  • RUNNING:運(yùn)行狀態(tài),線程池創(chuàng)建好之后就會(huì)進(jìn)入此狀態(tài),如果不手動(dòng)調(diào)用關(guān)閉方法,那么線程池在整個(gè)程序運(yùn)行期間都是此狀態(tài)。

  • SHUTDOWN:關(guān)閉狀態(tài),不再接受新任務(wù)提交,但是會(huì)將已保存在任務(wù)隊(duì)列中的任務(wù)處理完。

  • STOP:停止?fàn)顟B(tài),不再接受新任務(wù)提交,并且會(huì)中斷當(dāng)前正在執(zhí)行的任務(wù)、放棄任務(wù)隊(duì)列中已有的任務(wù)。

  • TIDYING:整理狀態(tài),所有的任務(wù)都執(zhí)行完畢后(也包括任務(wù)隊(duì)列中的任務(wù)執(zhí)行完),當(dāng)前線程池中的活動(dòng)線程數(shù)降為 0 時(shí)的狀態(tài)。到此狀態(tài)之后,會(huì)調(diào)用線程池的 terminated() 方法。

  • TERMINATED:銷毀狀態(tài),當(dāng)執(zhí)行完線程池的 terminated() 方法之后就會(huì)變?yōu)榇藸顟B(tài)。

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

java線程池狀態(tài)有哪些及狀態(tài)轉(zhuǎn)換實(shí)例分析

線程池狀態(tài)轉(zhuǎn)移

線程池的狀態(tài)轉(zhuǎn)移有兩條路徑:

  • 當(dāng)調(diào)用 shutdown() 方法時(shí),線程池的狀態(tài)會(huì)從 RUNNING 到 SHUTDOWN,再到 TIDYING,最后到 TERMENATED 銷毀狀態(tài)。

  • 當(dāng)調(diào)用 shutdownNow() 方法時(shí),線程池的狀態(tài)會(huì)從 RUNNING 到 STOP,再到 TIDYING,最后到 TERMENATED 銷毀狀態(tài)。

線程狀態(tài)轉(zhuǎn)換的流程如下圖所示: 

java線程池狀態(tài)有哪些及狀態(tài)轉(zhuǎn)換實(shí)例分析

terminated方法

線程池中的 terminated() 方法,也就是線程池從 TIDYING 轉(zhuǎn)換到 TERMINATED 狀態(tài)時(shí)調(diào)用的方法,默認(rèn)是空的,

它的源碼如下: 

java線程池狀態(tài)有哪些及狀態(tài)轉(zhuǎn)換實(shí)例分析

我們可以在創(chuàng)建線程池的時(shí)候重寫 terminated() 方法,具體實(shí)現(xiàn)代碼如下:

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() 方法");
            }
        };
        // 關(guān)閉線程池
        threadPool.shutdown();
        // 等待線程池執(zhí)行完再退出
        while (!threadPool.awaitTermination(1, TimeUnit.SECONDS)) {
            System.out.println("線程池正在運(yùn)行中");
        }
    }
}

到此,關(guān)于“java線程池狀態(tài)有哪些及狀態(tài)轉(zhuǎn)換實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

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

AI