溫馨提示×

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

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

Java的線程狀態(tài)是什么

發(fā)布時(shí)間:2022-11-07 09:32:25 來(lái)源:億速云 閱讀:112 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“Java的線程狀態(tài)是什么”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Java的線程狀態(tài)是什么”文章能幫助大家解決問(wèn)題。

Java的每個(gè)線程都具有自己的狀態(tài),Thread類中成員變量threadStatus存儲(chǔ)了線程的狀態(tài):

private volatile int threadStatus = 0;

在Thread類中也定義了狀態(tài)的枚舉,共六種,如下:

public enum State {
    NEW,			//	新建狀態(tài)
    RUNNABLE,		//	執(zhí)行狀態(tài)
    BLOCKED,		//	阻塞狀態(tài)
    WAITING,		//	無(wú)限期等待狀態(tài)
    TIMED_WAITING,  //  有限期等待狀態(tài)
    TERMINATED;     //  退出狀態(tài)
}

threadStatus初始值為0,對(duì)應(yīng)的就是NEW狀態(tài)。

  • NEW:新建狀態(tài),new Thread()時(shí)處于這個(gè)狀態(tài),此時(shí)線程還未開(kāi)始執(zhí)行

  • RUNNABLE:執(zhí)行狀態(tài),當(dāng)調(diào)用了start方法后,線程處于此狀態(tài),當(dāng)然此刻CPU不一定正在執(zhí)行它

  • BLOCKED:阻塞狀態(tài),線程等待鎖時(shí)處于此狀態(tài)

  • WAITING:無(wú)限期等待狀態(tài),需要被喚醒的等待屬于此狀態(tài),如Object.wait

  • TIMED_WAITING:有限期等待狀態(tài),調(diào)用一些有超時(shí)時(shí)間的等待方法會(huì)進(jìn)入此狀態(tài),如Thread.sleep、Object.wait、Thread.join、Lock.tryLock、Condition.await

  • TERMINATED:退出狀態(tài),可能是正常運(yùn)行完畢,也可能是拋出了異常導(dǎo)致線程終止

Java的線程狀態(tài)是什么

我們可以通過(guò)getState獲取線程的狀態(tài):

State state = thread.getState();

接下來(lái),我們通過(guò)示例來(lái)感受線程狀態(tài)的變化。

示例一:

Thread t = new Thread(() -> {
    System.out.println("sleep");
    //	休眠2秒
    ThreadUtil.sleep(2000);
    System.out.println("run");
});

//	啟動(dòng)前先打印一下線程狀態(tài)
System.out.println(t.getState());
//	啟動(dòng)線程
t.start();
//	啟動(dòng)后立即打印一次線程狀態(tài)
System.out.println(t.getState());

//	每隔500毫秒打印一次線程狀態(tài)
while (true) {
    ThreadUtil.sleep(500);
    System.out.println(t.getState());
}

輸出:

NEW
RUNNABLE
sleep
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
run
TERMINATED
TERMINATED
TERMINATED
TERMINATED
TERMINATED
TERMINATED
TERMINATED

可以看出,線程創(chuàng)建后,初始狀態(tài)為NEW;

調(diào)用start方法后狀態(tài)變更為了RUNNABLE;

當(dāng)線程內(nèi)執(zhí)行了sleep,休眠2秒鐘,狀態(tài)變更為了TIMED_WAITING;

當(dāng)線程執(zhí)行完成后,狀態(tài)變更為了TERMINATED。

示例二:

本示例演示在多線程爭(zhēng)搶鎖的情況下,線程狀態(tài)的變化。

private static Object lock = new Object();

public static void main(String[] args) {
    Runnable runnable = () -> {
        //	加鎖
        synchronized (lock) {
            System.out.println(Thread.currentThread().getName() + " lock");
            ThreadUtil.sleep(2000);
        }
        System.out.println(Thread.currentThread().getName() + " exit");
    };

    Thread t1 = new Thread(runnable, "t1");
    Thread t2 = new Thread(runnable, "t2");

    t1.start();
    t2.start();

    while (true) {
        ThreadUtil.sleep(500);
        System.out.println(t1.getName() + ":" + t1.getState());
        System.out.println(t2.getName() + ":" + t2.getState());
    }
}

輸出:

t1 lock                t1獲得了鎖
t1:TIMED_WAITING    t1 sleep,進(jìn)入有限等待狀態(tài)
t2:BLOCKED          t2未獲得鎖,因此進(jìn)入阻塞狀態(tài)
t1:TIMED_WAITING    
t2:BLOCKED
t1:TIMED_WAITING
t2:BLOCKED
t1 exit             t1釋放鎖,執(zhí)行完成,退出
t2 lock             t2獲得鎖
t1:TERMINATED       t1已經(jīng)是退出狀態(tài)
t2:TIMED_WAITING    t2 sleep,進(jìn)入有限等待狀態(tài)
t1:TERMINATED       
t2:TIMED_WAITING
t1:TERMINATED
t2:TIMED_WAITING
t1:TERMINATED
t2:TIMED_WAITING
t2 exit            t2釋放鎖,執(zhí)行完成,退出
t1:TERMINATED      t1為退出狀態(tài)
t2:TERMINATED      t2為退出狀態(tài)

示例三:

本示例演示了線程如何進(jìn)入和退出WAITING狀態(tài)。

private static Object obj = new Object();

public static void main(String[] args) {
    Runnable runnable = () -> {
        synchronized (obj) {
            try {
                //	等待
                obj.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("exit");
        }
    };

    Thread t1 = new Thread(runnable, "t1");
    System.out.println(t1.getName() + ":" + t1.getState());
    t1.start();
    System.out.println(t1.getName() + ":" + t1.getState());

    for (int i = 0; i < 20; i++) {
        ThreadUtil.sleep(500);
        if(i == 3) {
            synchronized (obj) {
                //	喚醒
                obj.notify();
            }
        }
        System.out.println(t1.getName() + ":" + t1.getState());
    }
}

輸出:

t1:NEW
t1:RUNNABLE
t1:WAITING    調(diào)用了obj.wait()進(jìn)入無(wú)限等待狀態(tài)
t1:WAITING
t1:WAITING
t1:BLOCKED  主線程獲得鎖,進(jìn)行notify,t1進(jìn)入了阻塞狀態(tài)
exit               t1線程退出同步塊,執(zhí)行完成
t1:TERMINATED  t1線程退出
t1:TERMINATED

Java Thread的threadStatus字段值的更新代碼位于hotspot c++源碼中,JDK源碼中看不到。

Java的線程狀態(tài)并非是操作系統(tǒng)的實(shí)際線程狀態(tài),但與操作系統(tǒng)的線程狀態(tài)是有對(duì)應(yīng)關(guān)系的,后續(xù)有需要深入分析操作系統(tǒng)原理、hotspot源碼再展開(kāi)。

關(guān)于“Java的線程狀態(tài)是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向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