中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java的線程狀態是什么

發布時間:2022-11-07 09:32:25 來源:億速云 閱讀:112 作者:iii 欄目:開發技術

這篇文章主要介紹“Java的線程狀態是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java的線程狀態是什么”文章能幫助大家解決問題。

Java的每個線程都具有自己的狀態,Thread類中成員變量threadStatus存儲了線程的狀態:

private volatile int threadStatus = 0;

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

public enum State {
    NEW,			//	新建狀態
    RUNNABLE,		//	執行狀態
    BLOCKED,		//	阻塞狀態
    WAITING,		//	無限期等待狀態
    TIMED_WAITING,  //  有限期等待狀態
    TERMINATED;     //  退出狀態
}

threadStatus初始值為0,對應的就是NEW狀態。

  • NEW:新建狀態,new Thread()時處于這個狀態,此時線程還未開始執行

  • RUNNABLE:執行狀態,當調用了start方法后,線程處于此狀態,當然此刻CPU不一定正在執行它

  • BLOCKED:阻塞狀態,線程等待鎖時處于此狀態

  • WAITING:無限期等待狀態,需要被喚醒的等待屬于此狀態,如Object.wait

  • TIMED_WAITING:有限期等待狀態,調用一些有超時時間的等待方法會進入此狀態,如Thread.sleep、Object.wait、Thread.join、Lock.tryLock、Condition.await

  • TERMINATED:退出狀態,可能是正常運行完畢,也可能是拋出了異常導致線程終止

Java的線程狀態是什么

我們可以通過getState獲取線程的狀態:

State state = thread.getState();

接下來,我們通過示例來感受線程狀態的變化。

示例一:

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

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

//	每隔500毫秒打印一次線程狀態
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

可以看出,線程創建后,初始狀態為NEW;

調用start方法后狀態變更為了RUNNABLE;

當線程內執行了sleep,休眠2秒鐘,狀態變更為了TIMED_WAITING;

當線程執行完成后,狀態變更為了TERMINATED。

示例二:

本示例演示在多線程爭搶鎖的情況下,線程狀態的變化。

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,進入有限等待狀態
t2:BLOCKED          t2未獲得鎖,因此進入阻塞狀態
t1:TIMED_WAITING    
t2:BLOCKED
t1:TIMED_WAITING
t2:BLOCKED
t1 exit             t1釋放鎖,執行完成,退出
t2 lock             t2獲得鎖
t1:TERMINATED       t1已經是退出狀態
t2:TIMED_WAITING    t2 sleep,進入有限等待狀態
t1:TERMINATED       
t2:TIMED_WAITING
t1:TERMINATED
t2:TIMED_WAITING
t1:TERMINATED
t2:TIMED_WAITING
t2 exit            t2釋放鎖,執行完成,退出
t1:TERMINATED      t1為退出狀態
t2:TERMINATED      t2為退出狀態

示例三:

本示例演示了線程如何進入和退出WAITING狀態。

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    調用了obj.wait()進入無限等待狀態
t1:WAITING
t1:WAITING
t1:BLOCKED  主線程獲得鎖,進行notify,t1進入了阻塞狀態
exit               t1線程退出同步塊,執行完成
t1:TERMINATED  t1線程退出
t1:TERMINATED

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

Java的線程狀態并非是操作系統的實際線程狀態,但與操作系統的線程狀態是有對應關系的,后續有需要深入分析操作系統原理、hotspot源碼再展開。

關于“Java的線程狀態是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

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

AI

宁国市| 宁远县| 武城县| 海南省| 岳池县| 蓬莱市| 宿松县| 深水埗区| 五家渠市| 新蔡县| 登封市| 崇礼县| 巴楚县| 万荣县| 石渠县| 望都县| 潜江市| 广水市| 阿克苏市| 武强县| 汝阳县| 高州市| 安康市| 徐水县| 阿拉善盟| 射阳县| 平定县| 平陆县| 曲阳县| 平罗县| 措勤县| 随州市| 黄浦区| 吉木乃县| 仪陇县| 鹿邑县| 中阳县| 澄江县| 应城市| 得荣县| 法库县|