欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2022年03月02日 11:25:04   作者:小小茶花女  
這篇文章主要為大家詳細介紹了Java 解析線程的幾種狀態(tài),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1. 線程的5種狀態(tài)

從操作系統(tǒng)層面上,任何線程一般都具有五種狀態(tài),即創(chuàng)建、就緒、運行、阻塞、終止。

(1) 新建狀態(tài)(NEW)

在程序中用構(gòu)造方法創(chuàng)建一個新線程時,如new Thread(),該線程就是創(chuàng)建狀態(tài),此時它已經(jīng)有了相應的內(nèi)存空間和其它資源,但是還沒有開始執(zhí)行。

(2) 就緒狀態(tài)(READ)

新建線程對象后,調(diào)用該線程的start()方法就可以啟動線程。當線程啟動時,線程就進入就緒狀態(tài)(runnable)
由于還沒有分配CPU,線程將進入線程隊列排隊,等待CPU服務,這表明它已經(jīng)具備了運行條件。當系統(tǒng)挑選一個等待執(zhí)行的Thread對象后,它就會從等待狀態(tài)進入執(zhí)行狀態(tài)。系統(tǒng)挑選的動作稱之為“CPU調(diào)度”。一旦獲得CPU,線程就進入運行狀態(tài)并自動調(diào)用自己的run方法。

(3) 運行狀態(tài)(RUNNING)

當就緒狀態(tài)的線程被調(diào)用并獲得處理器資源時,線程就進入了運行狀態(tài)。此時,自動調(diào)用該線程對象的run()方法。

(4) 阻塞狀態(tài)( BLOCKED)

一個正在執(zhí)行的線程在某些特殊情況下,如被人為掛起或需要執(zhí)行耗時的輸入輸出操作時,將讓出CPU并暫時中止自己的執(zhí)行,進入堵塞狀態(tài)。

在可執(zhí)行狀態(tài)下,如果調(diào)用sleep()、suspend()、wait()等方法,線程都將進入阻塞狀態(tài)。阻塞時,線程不能進入排隊隊列,只能當引起阻塞的原因被消除后,線程轉(zhuǎn)入就緒狀態(tài),重新到就緒隊列中排隊等待,這時被CPU調(diào)度選中后會從原來停止的位置開始繼續(xù)執(zhí)行。

記住:阻塞被消除后是回到就緒狀態(tài),不是運行狀態(tài)。

(5) 死亡狀態(tài)(TERMINATED)

線程調(diào)用stop(), destory()或run()執(zhí)行結(jié)束后,線程即處于死亡狀態(tài)。處于死亡狀態(tài)的線程不具有繼續(xù)運行的能力。

2. Java線程的6種狀態(tài)

Java中線程的生命周期分為6種狀態(tài)。Thread類有一個實例屬性和一個實例方法專門用于保存和獲取線程的狀態(tài)。其中,用于保存線程Thread實例狀態(tài)的實例屬性為:

// 以整數(shù)的形式保存線程的狀態(tài)
private volatile int threadStatus = 0;
// 返回當前線程的狀態(tài),一個枚舉類型值
public State getState() {
    return sun.misc.VM.toThreadState(threadStatus);
}

Thread.State是一個內(nèi)部枚舉類,定義了6個枚舉常量,分別代表Java線程的6種狀態(tài),具體如下:

public enum State {
    // 新建狀態(tài)
    NEW,
    // 運行狀態(tài)
    RUNNABLE,
    /**
     * 阻塞狀態(tài)
     * Object.wait
     */
    BLOCKED,
    /**
     *  等待狀態(tài)
     *  Object.wait
     *  Thread.join
     *  LockSupport.park
     */
    WAITING,
    /**
     *  限時等待狀態(tài)
     *  Thread.sleep
     *  Object.wait
     *  Thread.join
     *  LockSupport.parkUntil
     *  LockSupport.parkNanos
     */
    TIMED_WAITING,
    // 終止狀態(tài)
    TERMINATED;
}

有4種是比較常見的狀態(tài),它們是:NEW(新建)狀態(tài)、RUNNABLE(可執(zhí)行)狀態(tài)、TERMINATED(終止)狀態(tài)、TIMED_WAITING(限時等待)狀態(tài)。

(1) NEW狀態(tài)

Java源碼對NEW狀態(tài)的說明是:創(chuàng)建成功但是沒有調(diào)用start()方法啟動的Thread線程實例都處于NEW狀態(tài)。

當然,并不是Thread線程實例的start()方法一經(jīng)調(diào)用,其狀態(tài)就從NEW狀態(tài)到RUNNABLE狀態(tài),此時并不意味著線程立即獲取CPU時間片并且立即執(zhí)行,中間需要一系列操作系統(tǒng)的內(nèi)部操作。

(2) RUNNABLE狀態(tài)

當調(diào)用了Thread實例的start()方法后,下一步如果線程獲取CPU時間片開始執(zhí)行,JVM將異步調(diào)用線程的run()方法執(zhí)行其業(yè)務代碼。那么在run()方法被異步調(diào)用之前,JVM做了哪些事情呢?當Java線程的Thread實例的start()方法被調(diào)用后,操作系統(tǒng)中的對應線程進入的并不是運行狀態(tài),而是就緒狀態(tài),而Java線程并沒有這個就緒狀態(tài)。操作系統(tǒng)中線程的就緒狀態(tài)是什么狀態(tài)的呢?JVM的線程狀態(tài)與其幕后的操作系統(tǒng)線程狀態(tài)之間的轉(zhuǎn)換關(guān)系簡化后如圖:

在這里插入圖片描述

一個操作系統(tǒng)線程如果處于就緒狀態(tài),就表示“萬事俱備,只欠東風”,即該線程已經(jīng)滿足執(zhí)行條件,但是還不能執(zhí)行。處于就緒狀態(tài)的線程需要等待系統(tǒng)的調(diào)度,一旦就緒狀態(tài)被系統(tǒng)選中,獲得CPU時間片,線程就開始占用CPU,開始執(zhí)行線程的代碼,這時線程的操作系統(tǒng)狀態(tài)發(fā)生了改變,進入了運行狀態(tài)。

在操作系統(tǒng)中,處于運行狀態(tài)的線程在CPU時間片用完之后,又回到就緒狀態(tài),等待CPU的下一次調(diào)度。就這樣,操作系統(tǒng)線程在就緒狀態(tài)和執(zhí)行狀態(tài)之間被系統(tǒng)反復地調(diào)度,這種情況會一直持續(xù),直到線程的代碼邏輯執(zhí)行完成或者異常終止。這時線程的操作系統(tǒng)狀態(tài)又發(fā)生了改變,進入線程的最后狀態(tài)——TERMINATED狀態(tài)。

就緒狀態(tài)和運行狀態(tài)都是操作系統(tǒng)中的線程狀態(tài)。在Java語言中,并沒有細分這兩種狀態(tài),而是將這兩種狀態(tài)合并成同一種狀態(tài)——RUNNABLE狀態(tài)。因此,在Thread.State枚舉類中,沒有定義線程的就緒狀態(tài)和運行狀態(tài),只是定義了RUNNABLE狀態(tài)。這就是Java線程狀態(tài)和操作系統(tǒng)中線程狀態(tài)不同的地方。

總之,NEW狀態(tài)的Thread實例調(diào)用了start()方法后,線程的狀態(tài)將變成RUNNABLE狀態(tài)。盡管如此,線程的run()方法不一定會馬上被并發(fā)執(zhí)行,需要在線程獲取了CPU時間片之后才真正啟動并發(fā)執(zhí)行。

(3) TERMINATED狀態(tài)

處于RUNNABLE狀態(tài)的線程在run()方法執(zhí)行完成之后就變成終止狀態(tài)TERMINATED了。當然,如果在run()方法執(zhí)行過程中發(fā)生了運行時異常而沒有被捕獲,run()方法將被異常終止,線程也會變成TERMINATED狀態(tài)。

(4) TIMED_WAITING狀態(tài)

線程處于一種特殊的等待狀態(tài),準確地說,線程處于限時等待狀態(tài)。能讓線程處于限時等待狀態(tài)的操作大致有以下幾種:

  • Thread.sleep(int n):使得當前線程進入限時等待狀態(tài),等待時間為n毫秒。
  • Object.wait():帶時限的搶占對象的monitor鎖。
  • Thread.join():帶時限的線程合并。
  • LockSupport.parkNanos():讓線程等待,時間以納秒為單位。
  • LockSupport.parkUntil():讓線程等待,時間可以靈活設(shè)置。

3. Java線程狀態(tài)的轉(zhuǎn)換

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!      

相關(guān)文章

  • java進行文件讀寫操作詳解

    java進行文件讀寫操作詳解

    這篇文章主要介紹了java進行文件讀寫操作詳解的相關(guān)資料,需要的朋友可以參考下
    2014-10-10
  • Java class文件格式之屬性詳解_動力節(jié)點java學院整理

    Java class文件格式之屬性詳解_動力節(jié)點java學院整理

    這篇文章主要介紹了Java class文件格式之屬性詳解,需要的朋友可以參考下
    2017-06-06
  • java 單元測試 對h2數(shù)據(jù)庫數(shù)據(jù)清理方式

    java 單元測試 對h2數(shù)據(jù)庫數(shù)據(jù)清理方式

    這篇文章主要介紹了java 單元測試 對h2數(shù)據(jù)庫數(shù)據(jù)清理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 討論分析JDK17是否會代替JDK8

    討論分析JDK17是否會代替JDK8

    這篇文章主要為大家介紹了JDK17是否會代替JDK8的問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Spring Boot整合Web項目常用功能詳解

    Spring Boot整合Web項目常用功能詳解

    這篇文章主要介紹了Spring Boot整合Web項目常用功能詳解,在Web應用開發(fā)過程中,可以通過Spring Boot的Starter來將這些常用功能進行整合與集中維護,以達到開箱即用的目的。,需要的朋友可以參考下
    2019-06-06
  • Maven項目讀取resources文件路徑問題解決方案

    Maven項目讀取resources文件路徑問題解決方案

    這篇文章主要介紹了Maven項目讀取resources文件路徑問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式

    postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式

    這篇文章主要介紹了postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Java連接合并2個數(shù)組(Array)的5種方法例子

    Java連接合并2個數(shù)組(Array)的5種方法例子

    最近在寫代碼時遇到了需要合并兩個數(shù)組的需求,突然發(fā)現(xiàn)以前沒用過,于是研究了一下合并數(shù)組的方式,這篇文章主要給大家介紹了關(guān)于Java連接合并2個數(shù)組(Array)的5種方法,需要的朋友可以參考下
    2023-12-12
  • 深入理解Java動態(tài)代理與靜態(tài)代理

    深入理解Java動態(tài)代理與靜態(tài)代理

    這篇文章主要介紹了深入理解Java動態(tài)代理與靜態(tài)代理,靜態(tài)代理,代理類和被代理的類實現(xiàn)了同樣的接口,代理類同時持有被代理類的引用,動態(tài)代理的根據(jù)實現(xiàn)方式的不同可以分為JDK動態(tài)代理和CGlib動態(tài)代理
    2022-06-06
  • java 學習筆記(入門篇)_java程序helloWorld

    java 學習筆記(入門篇)_java程序helloWorld

    安裝配置完Java的jdk,下面就開始寫第一個java程序--hello World.用來在控制臺輸出“Hello World”,接下來詳細介紹,感興趣的朋友可以參考下
    2013-01-01

最新評論