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

深入探究Java線程的狀態(tài)與生命周期

 更新時(shí)間:2022年04月26日 09:36:55   作者:淡沫初夏Zz  
在java中,任何對(duì)象都要有生命周期,線程也不例外,它也有自己的生命周期。線程的整個(gè)生命周期可以分為5個(gè)階段,分別是新建狀態(tài)、就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)和死亡狀態(tài)

一、線程的狀態(tài)

NEW: 安排了工作, 還未開始行動(dòng)
RUNNABLE: 可工作的. 又可以分成正在工作中和即將開始工作.
BLOCKED: 這幾個(gè)都表示排隊(duì)等著其他事情
WAITING: 這幾個(gè)都表示排隊(duì)等著其他事情
TIMED_WAITING: 這幾個(gè)都表示排隊(duì)等著其他事情
TERMINATED: 工作完成了

新建(初始)

當(dāng)繼承Thread類和實(shí)現(xiàn)了Runnable接口,就可以創(chuàng)建線程,新建一個(gè)對(duì)象就是初始狀態(tài)

就緒(可運(yùn)行)

  • 調(diào)用線程的start()方法,此線程進(jìn)入可運(yùn)行狀態(tài)。
  • 當(dāng)前線程sleep()方法結(jié)束,其他線程join()結(jié)束,等待用戶輸入完畢,某個(gè)線程拿到對(duì)象鎖,這些線程也將進(jìn)入可運(yùn)行狀態(tài)。
  • 當(dāng)前線程時(shí)間片用完了,調(diào)用當(dāng)前線程的yield()方法,當(dāng)前線程進(jìn)入可運(yùn)行狀態(tài)。
  • 鎖池里的線程拿到對(duì)象鎖后,進(jìn)入可運(yùn)行狀態(tài)。

運(yùn)行

可運(yùn)行狀態(tài)(runnable)的線程獲得了cpu 時(shí)間片(timeslice) ,執(zhí)行程序代碼,就到了運(yùn)行狀態(tài)

阻塞

阻塞狀態(tài)是指線程因?yàn)槟撤N原因放棄了cpu 使用權(quán),也即讓出了cpu 時(shí)間片,暫時(shí)停止運(yùn)行。直到線程進(jìn)入可運(yùn)行(runnable)狀態(tài),才有機(jī)會(huì)再次獲得cpu 時(shí)間片轉(zhuǎn)到運(yùn)行(running)狀態(tài)

  • 當(dāng)前線程T調(diào)用Thread.sleep()方法,當(dāng)前線程進(jìn)入阻塞狀態(tài)。
  • 運(yùn)行在當(dāng)前線程里的其它線程t2調(diào)用join()方法,當(dāng)前線程進(jìn)入阻塞狀態(tài)。
  • 等待用戶輸入的時(shí)候,當(dāng)前線程進(jìn)入阻塞狀態(tài)

死亡

  • 當(dāng)線程的run()方法完成時(shí),或者主線程的main()方法完成時(shí),我們就認(rèn)為它死去。這個(gè)線程對(duì)象也許是活的,但是,它已經(jīng)不是一個(gè)單獨(dú)執(zhí)行的線程。線程一旦死亡,就不能復(fù)生。
  • 在一個(gè)死去的線程上調(diào)用start()方法,會(huì)拋出java.lang.IllegalThreadStateException異常

二、線程的狀態(tài)轉(zhuǎn)移

NEW , RUNNABLE ,TERMINATED 狀態(tài)的轉(zhuǎn)移

使用 isAlive 方法判定線程的存活狀態(tài)

public class ThreadStateTransfer {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 1000_0000; i++) {
            }
        }, "李四");
        System.out.println(t.getName() + ": " + t.getState());;
        t.start();
        while (t.isAlive()) {
            System.out.println(t.getName() + ": " + t.getState());;
        }
        System.out.println(t.getName() + ": " + t.getState());;
    }
}

yield() 方法,讓出 CPU執(zhí)行權(quán)

/**
 * yield讓出CPU執(zhí)行權(quán)
 */
public class ThreadYield {
    public static void main(String[] args) {
        Thread thread  = new Thread(() ->{
            Thread t1 = Thread.currentThread();
            for (int i = 0; i < 10; i++) {
                //讓出CPU執(zhí)行權(quán)
                Thread.yield();
                System.out.println("執(zhí)行了線程" + t1.getName());
            }
        },"張三");
        thread.start();
        //創(chuàng)建并啟動(dòng)線程
        new Thread(() -> {
            Thread t1 = Thread.currentThread();
            for (int i = 0; i < 10; i++) {
                System.out.println("執(zhí)行了線程" + t1.getName());
            }
        },"李四").start();
    }

結(jié)論

yield 不改變線程的狀態(tài), 但是會(huì)重新去排隊(duì)

三、線程的生命周期

  • 新建:創(chuàng)建線程對(duì)象
  • 就緒:線程有執(zhí)行資格,沒有執(zhí)行權(quán)
  • 運(yùn)行:有執(zhí)行資格,有執(zhí)行權(quán)
  • 阻塞:由于一些操作讓線程改變了狀態(tài),沒有執(zhí)行資格,沒有執(zhí)行權(quán),另一些操作可以把它給激活,激活處于就緒狀態(tài)
  • 死亡:線程對(duì)象變成垃圾,等待被回收

到此這篇關(guān)于深入探究Java線程的狀態(tài)與生命周期的文章就介紹到這了,更多相關(guān)Java線程狀態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中super和this的用法詳解

    Java中super和this的用法詳解

    這篇文章主要介紹了Java中super和this的用法詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java javax.annotation.Resource注解的詳解

    java javax.annotation.Resource注解的詳解

    這篇文章主要介紹了javax.annotation.Resource注解的詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • java自定義線程池的原理簡(jiǎn)介

    java自定義線程池的原理簡(jiǎn)介

    這篇文章主要介紹了java自定義線程池的原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 使用Springboot實(shí)現(xiàn)獲取某個(gè)城市當(dāng)天的天氣預(yù)報(bào)

    使用Springboot實(shí)現(xiàn)獲取某個(gè)城市當(dāng)天的天氣預(yù)報(bào)

    這篇文章主要為大家詳細(xì)介紹了使用Springboot實(shí)現(xiàn)獲取某個(gè)城市當(dāng)天的天氣預(yù)報(bào)的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • SpringBoot根據(jù)目錄結(jié)構(gòu)自動(dòng)生成路由前綴的實(shí)現(xiàn)代碼

    SpringBoot根據(jù)目錄結(jié)構(gòu)自動(dòng)生成路由前綴的實(shí)現(xiàn)代碼

    本文介紹如何根據(jù)目錄結(jié)構(gòu)給RequestMapping添加路由前綴,具體實(shí)現(xiàn)方法,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-08-08
  • Java集合類中文介紹

    Java集合類中文介紹

    本文首先對(duì)Java集合類框架做了簡(jiǎn)單說明,之后對(duì)主要類和為API做了介紹:Collection、List、Set、AbstractCollection、AbstractList、AbstractSet、Iterator、ListIterator。
    2013-11-11
  • Java基礎(chǔ)第三篇 構(gòu)造器與方法重載

    Java基礎(chǔ)第三篇 構(gòu)造器與方法重載

    顯式初始化要求我們?cè)趯懗绦驎r(shí)就確定初始值,這有時(shí)很不方便。我們可以使用構(gòu)造器(constructor)來初始化對(duì)象。構(gòu)造器可以初始化數(shù)據(jù)成員,還可以規(guī)定特定的操作。這些操作會(huì)在創(chuàng)建對(duì)象時(shí)自動(dòng)執(zhí)行。下面文字將對(duì)該內(nèi)容做詳細(xì)介紹,需要的小伙伴請(qǐng)參考
    2021-09-09
  • 關(guān)于logBack配置日志文件及編碼配置的問題

    關(guān)于logBack配置日志文件及編碼配置的問題

    這篇文章主要介紹了logBack配置日志文件及編碼配置的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring AOP實(shí)現(xiàn)接口請(qǐng)求記錄到數(shù)據(jù)庫的示例代碼

    Spring AOP實(shí)現(xiàn)接口請(qǐng)求記錄到數(shù)據(jù)庫的示例代碼

    這篇文章主要介紹了Spring AOP實(shí)現(xiàn)接口請(qǐng)求記錄到數(shù)據(jù)庫,代碼包括引入AOP依賴及創(chuàng)建日志記錄表,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Java內(nèi)存模型的深入講解

    Java內(nèi)存模型的深入講解

    這篇文章主要給大家介紹了關(guān)于Java內(nèi)存模型的相關(guān)資料,我們常說的JVM內(nèi)存模式指的是JVM的內(nèi)存分區(qū),而Java內(nèi)存模式是一種虛擬機(jī)規(guī)范,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

陆河县| 竹北市| 余姚市| 浙江省| 青神县| 鸡泽县| 阿城市| 通州市| 略阳县| 云林县| 朝阳县| 新宾| 永修县| 高安市| 连州市| 天等县| 永州市| 绥化市| 乌拉特中旗| 丘北县| 湘西| 金塔县| 日土县| 柯坪县| 邻水| 新野县| 安阳市| 阳高县| 万山特区| 浙江省| 富源县| 南和县| 田东县| 铜陵市| 北川| 莱西市| 临城县| 孟津县| 蓬溪县| 乳源| 克山县|