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

Java線程生命周期及轉(zhuǎn)換過程

 更新時間:2022年05月09日 13:59:56   作者:??Java中文社群????  
這篇文章主要介紹了Java線程生命周期及轉(zhuǎn)換過程,線程的生命周期指的是線程從創(chuàng)建到銷毀的整個過程初始狀態(tài)、可運行狀態(tài)、運行狀態(tài)、休眠狀態(tài)、終止狀態(tài),更多詳細介紹,需要的小伙伴可以參考下面文章內(nèi)容

前言:

線程的生命周期指的是線程從創(chuàng)建到銷毀的整個過程,通常情況下線程的生命周期有以下 5 種:

  • 初始狀態(tài)
  • 可運行狀態(tài)
  • 運行狀態(tài)
  • 休眠狀態(tài)
  • 終止狀態(tài)

它們的狀態(tài)轉(zhuǎn)換如下圖所示: 

Java 線程生命周期

Java 線程的生命周期和上面說的生命周期是不同的,它有以下 6 種狀態(tài):

  • NEW(初始化狀態(tài))
  • RUNNABLE(可運行/運行狀態(tài))
  • BLOCKED(阻塞狀態(tài))
  • WAITING(無時限等待狀態(tài))
  • TIMED_WAITING(有時限等待狀態(tài))
  • TERMINATED(終止狀態(tài))

我們可以在 Thread 的源碼中可以找到這 6 種狀態(tài),如下所示: 

 當然你也可以使用 Java 代碼,來打印所有的線程狀態(tài),如下代碼所示:

for (Thread.State value : Thread.State.values()) {
    System.out.println(value);
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

生命周期轉(zhuǎn)換

接下來我們聊聊 Java 線程生命周期的轉(zhuǎn)換過程。

1.從 NEW 到 RUNNABLE

當我們創(chuàng)建一個線程的時候,也就是 new Thread 的時候,此時線程是 NEW 狀態(tài),如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // ...
    }
});
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
System.out.println(state);

以上程序的執(zhí)行結(jié)果如下圖所示: 

 然而調(diào)用了線程的 start 方法之后,線程的狀態(tài)就從 NEW 變成了 RUNNABLE,

如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // 獲取到當前執(zhí)行的線程
        Thread currThread = Thread.currentThread();
        // 獲取線程狀態(tài)
        Thread.State state = currThread.getState();
        // 打印線程狀態(tài)
        System.out.println(state);
    }
});
thread.start();

以上程序的執(zhí)行結(jié)果如下圖所示: 

2.從 RUNNABLE 到 BLOCKED

當線程中的代碼排隊執(zhí)行 synchronized 時,線程就會從 RUNNABLE 狀態(tài)變?yōu)?BLOCKED 阻塞狀態(tài)

如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            // 等待 100 毫秒
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("排隊使用鎖");
        synchronized (ThreadStates.class) {
        }
    }
});
thread.start();
// 讓主線程先得到鎖
synchronized (ThreadStates.class) {
    // 獲取線程狀態(tài)
    Thread.State state = thread.getState();
    // 打印線程狀態(tài)
    System.out.println("首次獲取線程狀態(tài):" + state);
    // 休眠 1s
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    // 再次獲取線程狀態(tài)
    state = thread.getState();
    // 打印線程狀態(tài)
    System.out.println("第二次獲取線程狀態(tài):" + state);
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

 當線程獲取到 synchronized 鎖之后,就會從 BLOCKED 狀態(tài)轉(zhuǎn)變?yōu)?RUNNABLE 狀態(tài)。

3.從 RUNNABLE 到 WAITTING

線程調(diào)用 wait() 方法之后,就會從 RUNNABLE 狀態(tài)變?yōu)?WAITING 無時限等待狀態(tài),如下所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        synchronized (this) {
            try {
                // 線程休眠
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
});
// 啟動線程
thread.start();
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("首次獲取線程狀態(tài):" + state);
// 休眠 1s
try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
// 獲取線程狀態(tài)
state = thread.getState();
// 打印線程狀態(tài)
System.out.println("第二次獲取線程狀態(tài):" + state);

以上程序的執(zhí)行結(jié)果如下圖所示: 

 當調(diào)用了 notify/notifyAll 方法之后,線程會從 WAITING 狀態(tài)變成 RUNNABLE 狀態(tài),

如下代碼所示:

Object lock = new Object();
// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        synchronized (lock) {
            try {
                // 線程休眠
                lock.wait();
                // 獲取當前線程狀態(tài)
                Thread.State state = Thread.currentThread().getState();
                // 打印線程狀態(tài)
                System.out.println("獲取線程狀態(tài):" + state);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
});
// 啟動線程
thread.start();
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("首次獲取線程狀態(tài):" + state);
// 休眠 1s
try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    e.printStackTrace();
}
// 獲取線程狀態(tài)
state = thread.getState();
// 打印線程狀態(tài)
System.out.println("第二次獲取線程狀態(tài):" + state);

// 喚醒 thread 線程
synchronized (lock) {
    lock.notify();
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

4.從 RUNNABLE 到 TIMED_WATTING

當調(diào)用帶超時時間的等待方法時,如 sleep(xxx),線程會從 RUNNABLE 狀態(tài)變成 TIMED_WAITING 有時限狀態(tài),

如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});
// 啟動線程
thread.start();
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("首次獲取線程狀態(tài):" + state);
// 休眠 1s
try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    e.printStackTrace();
}
// 獲取線程狀態(tài)
state = thread.getState();
// 打印線程狀態(tài)
System.out.println("第二次獲取線程狀態(tài):" + state);

以上程序的執(zhí)行結(jié)果如下圖所示: 

 當超過了超時時間之后,線程就會從 TIMED_WAITING 狀態(tài)變成 RUNNABLE 狀態(tài),

實現(xiàn)代碼如下:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            // 獲取當前線程狀態(tài)
            Thread.State state = Thread.currentThread().getState();
            // 打印線程狀態(tài)
            System.out.println("獲取線程狀態(tài):" + state);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});
// 啟動線程
thread.start();
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("首次獲取線程狀態(tài):" + state);
// 休眠 1s
try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    e.printStackTrace();
}
// 獲取線程狀態(tài)
state = thread.getState();
// 打印線程狀態(tài)
System.out.println("第二次獲取線程狀態(tài):" + state);

以上程序的執(zhí)行結(jié)果如下圖所示: 

5.RUNNABLE 到 TERMINATED

線程執(zhí)行完之后,就會從 RUNNABLE 狀態(tài)變成 TERMINATED 銷毀狀態(tài),如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // 獲取當前線程狀態(tài)
        Thread.State state = Thread.currentThread().getState();
        // 打印線程狀態(tài)
        System.out.println("獲取線程狀態(tài):" + state);
    }
});
// 啟動線程
thread.start();
// 等待 100ms,待線程執(zhí)行完
Thread.sleep(100);
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("線程狀態(tài):" + state);

以上程序的執(zhí)行結(jié)果如下圖所示: 

總結(jié)

Java 中線程的生命周期有 6 種:NEW(初始化狀態(tài))、RUNNABLE(可運行/運行狀態(tài))、BLOCKED(阻塞狀態(tài))、WAITING(無時限等待狀態(tài))、TIMED_WAITING(有時限等待狀態(tài))、TERMINATED(終止狀態(tài))。

線程生命周期的轉(zhuǎn)換流程如下圖所示: 

到此這篇關(guān)于Java線程生命周期及轉(zhuǎn)換過程的文章就介紹到這了,更多相關(guān)Java線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis中輸入輸出映射與動態(tài)Sql圖文詳解

    Mybatis中輸入輸出映射與動態(tài)Sql圖文詳解

    這篇文章主要給大家介紹了關(guān)于Mybatis中輸入輸出映射與動態(tài)Sql的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • RestTemplate報錯400 Bad Request的解決方案

    RestTemplate報錯400 Bad Request的解決方案

    在使用Spring Boot時,若直接通過@Autowired注入RestTemplate可能會遇到400BadRequest錯誤,原因在于Spring Boot官方文檔指出,由于RestTemplate實例通常需要在使用前進行定制,因此Spring Boot不會自動配置單個RestTemplate Bean
    2024-11-11
  • Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld

    Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld

    這篇文章主要介紹了Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld的實現(xiàn)過程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • Log4j定時打印日志及添加模塊名配置的Java代碼實例

    Log4j定時打印日志及添加模塊名配置的Java代碼實例

    這篇文章主要介紹了Log4j定時打印日志及添加模塊名配置的Java代碼實例,Log4j是Apache的一個開源Java日志項目,需要的朋友可以參考下
    2016-01-01
  • Java實現(xiàn)差分數(shù)組的示例詳解

    Java實現(xiàn)差分數(shù)組的示例詳解

    差分數(shù)組是由原數(shù)組進化而來,值為原數(shù)組當前位置值減去上一個位置的值。本文將通過例題詳解如何利用Java實現(xiàn)差分數(shù)組,需要的可以參考一下
    2022-06-06
  • Java annotation元注解原理實例解析

    Java annotation元注解原理實例解析

    這篇文章主要介紹了Java annotation元注解原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 如何關(guān)閉 IDEA 自動更新

    如何關(guān)閉 IDEA 自動更新

    這篇文章主要介紹了如何關(guān)閉 IDEA 自動更新,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • java獲取手機已安裝APK的簽名摘要

    java獲取手機已安裝APK的簽名摘要

    這篇文章主要介紹了java獲取手機已安裝APK的簽名摘要的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 淺談Java中父類與子類的加載順序詳解

    淺談Java中父類與子類的加載順序詳解

    本篇文章是對Java中父類與子類的加載順序進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Spring中的@Transactional事務(wù)失效場景解讀

    Spring中的@Transactional事務(wù)失效場景解讀

    這篇文章主要介紹了Spring中的@Transactional事務(wù)失效場景解讀,如果Transactional注解應(yīng)用在非public 修飾的方法上,Transactional將會失效此方法會檢查目標方法的修飾符是否為 public,不是 public則不會獲取@Transactional 的屬性配置信息,需要的朋友可以參考下
    2023-12-12

最新評論

新泰市| 泰州市| 内江市| 和平区| 西青区| 汨罗市| 杭州市| 新津县| 丹凤县| 航空| 郧西县| 奈曼旗| 蓝田县| 舞钢市| 红原县| 元氏县| 巫山县| 太保市| 洱源县| 永年县| 康保县| 丽江市| 三河市| 灵台县| 灌云县| 伊通| 巴彦县| 于都县| 潢川县| 陇南市| 金山区| 遂昌县| 鄯善县| 长岭县| 周至县| 莒南县| 若尔盖县| 深圳市| 抚宁县| 诏安县| 巴青县|