最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java的線程狀態(tài)

 更新時間:2022年11月06日 08:49:54   作者:UnicornLien  
本文主要為大家詳細介紹一下Java的線程狀態(tài),文中的示例代碼講解詳細,對我們學習有一定的幫助,感興趣的小伙伴可以跟隨小編學習一下

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

private volatile int threadStatus = 0;

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

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

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

  • NEW:新建狀態(tài),new Thread()時處于這個狀態(tài),此時線程還未開始執(zhí)行
  • RUNNABLE:執(zhí)行狀態(tài),當調用了start方法后,線程處于此狀態(tài),當然此刻CPU不一定正在執(zhí)行它
  • BLOCKED:阻塞狀態(tài),線程等待鎖時處于此狀態(tài)
  • WAITING:無限期等待狀態(tài),需要被喚醒的等待屬于此狀態(tài),如Object.wait
  • TIMED_WAITING:有限期等待狀態(tài),調用一些有超時時間的等待方法會進入此狀態(tài),如Thread.sleep、Object.wait、Thread.join、Lock.tryLock、Condition.await
  • TERMINATED:退出狀態(tài),可能是正常運行完畢,也可能是拋出了異常導致線程終止

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

State state = thread.getState();

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

示例一:

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

//	啟動前先打印一下線程狀態(tài)
System.out.println(t.getState());
//	啟動線程
t.start();
//	啟動后立即打印一次線程狀態(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;

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

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

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

示例二:

本示例演示在多線程爭搶鎖的情況下,線程狀態(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,進入有限等待狀態(tài)
t2:BLOCKED          t2未獲得鎖,因此進入阻塞狀態(tài)
t1:TIMED_WAITING    
t2:BLOCKED
t1:TIMED_WAITING
t2:BLOCKED
t1 exit             t1釋放鎖,執(zhí)行完成,退出
t2 lock             t2獲得鎖
t1:TERMINATED       t1已經是退出狀態(tài)
t2:TIMED_WAITING    t2 sleep,進入有限等待狀態(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)

示例三:

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

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

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

到此這篇關于詳解Java的線程狀態(tài)的文章就介紹到這了,更多相關Java線程狀態(tài)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MyBatis ORM映射方式示例詳解

    MyBatis ORM映射方式示例詳解

    MyBatis作為一種靈活且強大的ORM框架,提供了多種映射方式,包括基于XML的映射、基于注解的映射以及混合映射,這篇文章主要介紹了MyBatis ORM映射方式詳解,需要的朋友可以參考下
    2024-12-12
  • JAVA十大排序算法之基數(shù)排序詳解

    JAVA十大排序算法之基數(shù)排序詳解

    這篇文章主要介紹了java中的基數(shù)排序,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • SpringBoot?如何從容器中獲取對象

    SpringBoot?如何從容器中獲取對象

    這篇文章主要介紹了SpringBoot?如何從容器中獲取對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java數(shù)組轉換為集合的相關方法

    Java數(shù)組轉換為集合的相關方法

    在Java中我們經常需要將數(shù)組從一種類型轉換為另一種類型,下面這篇文章主要給大家介紹了關于Java數(shù)組轉換為集合的相關方法,文中通過圖文及代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • SpringBoot使用Spring-Data-Jpa實現(xiàn)CRUD操作

    SpringBoot使用Spring-Data-Jpa實現(xiàn)CRUD操作

    這篇文章主要為大家詳細介紹了SpringBoot使用Spring-Data-Jpa實現(xiàn)CRUD操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java中Https發(fā)送POST請求[親測可用]

    Java中Https發(fā)送POST請求[親測可用]

    這篇文章主要介紹了Java中Https發(fā)送POST請求[親測可用],本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Java?常見排序算法代碼分享

    Java?常見排序算法代碼分享

    這篇文章主要介紹了Java?常見排序算法代碼分享,文章通過分享詳細的代碼總結文章內容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-03-03
  • 分析設計模式之模板方法Java實現(xiàn)

    分析設計模式之模板方法Java實現(xiàn)

    所謂模板方法模式,就是一個對模板的應用,就好比老師出試卷,每個人的試卷都是一樣的,這個原版試卷就是一個模板,可每個人寫在試卷上的答案都是不一樣的,這就是模板方法模式。它的主要用途在于將不變的行為從子類搬到超類,去除了子類中的重復代碼
    2021-06-06
  • java使用POI讀取properties文件并寫到Excel的方法

    java使用POI讀取properties文件并寫到Excel的方法

    這篇文章主要介紹了java使用POI讀取properties文件并寫到Excel的方法,涉及java操作properties文件及Excel文件的相關技巧,需要的朋友可以參考下
    2015-06-06
  • Java開發(fā)之普通web項目轉為Maven項目的方法

    Java開發(fā)之普通web項目轉為Maven項目的方法

    這篇文章主要給大家介紹了關于Java開發(fā)之普通web項目轉為Maven項目的相關資料,文中通過圖文將轉換的方法步驟介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-12-12

最新評論

平和县| 津市市| 酒泉市| 遂宁市| 永寿县| 岳西县| 巴中市| 南澳县| 同江市| 京山县| 安康市| 婺源县| 张家界市| 响水县| 若尔盖县| 堆龙德庆县| 新丰县| 普兰店市| 南靖县| 崇文区| 阳高县| 建湖县| 垣曲县| 清涧县| 平南县| 无为县| 杭锦后旗| 清河县| 乌鲁木齐市| 久治县| 新安县| 和龙市| 视频| 绿春县| 琼海市| 金门县| 浦县| 金坛市| 新源县| 乐陵市| 龙胜|