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

Java線程的五種狀態(tài)介紹

 更新時(shí)間:2022年08月22日 16:29:01   作者:π大星的日常  
本文主要為大家詳細(xì)介紹一下Java實(shí)現(xiàn)線程創(chuàng)建的五種寫法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的幫助,感興趣的可以跟隨小編學(xué)習(xí)一下

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

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

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

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

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

新建線程對(duì)象后,調(diào)用該線程的start()方法就可以啟動(dòng)線程。當(dāng)線程啟動(dòng)時(shí),線程就進(jìn)入就緒狀態(tài)(runnable)

由于還沒(méi)有分配CPU,線程將進(jìn)入線程隊(duì)列排隊(duì),等待CPU服務(wù),這表明它已經(jīng)具備了運(yùn)行條件。當(dāng)系統(tǒng)挑選一個(gè)等待執(zhí)行的Thread對(duì)象后,它就會(huì)從等待狀態(tài)進(jìn)入執(zhí)行狀態(tài)。系統(tǒng)挑選的動(dòng)作稱之為“CPU調(diào)度”。一旦獲得CPU,線程就進(jìn)入運(yùn)行狀態(tài)并自動(dòng)調(diào)用自己的run方法。

(3) 運(yùn)行狀態(tài)(RUNNING)

當(dāng)就緒狀態(tài)的線程被調(diào)用并獲得處理器資源時(shí),線程就進(jìn)入了運(yùn)行狀態(tài)。此時(shí),自動(dòng)調(diào)用該線程對(duì)象的run()方法。

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

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

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

記?。鹤枞幌笫腔氐骄途w狀態(tài),不是運(yùn)行狀態(tài)。

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

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

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

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

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

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

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

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

(1) NEW狀態(tài)

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

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

(2) RUNNABLE狀態(tài)

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

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

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

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

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

(3) TERMINATED狀態(tài)

處于RUNNABLE狀態(tài)的線程在run()方法執(zhí)行完成之后就變成終止?fàn)顟B(tài)TERMINATED了。當(dāng)然,如果在run()方法執(zhí)行過(guò)程中發(fā)生了運(yùn)行時(shí)異常而沒(méi)有被捕獲,run()方法將被異常終止,線程也會(huì)變成TERMINATED狀態(tài)。

(4) TIMED_WAITING狀態(tài)

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

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

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

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

相關(guān)文章

  • 詳細(xì)談?wù)凷pring事務(wù)是如何管理的

    詳細(xì)談?wù)凷pring事務(wù)是如何管理的

    在使用傳統(tǒng)的事務(wù)編程策略時(shí),程序代碼必然和具體的事務(wù)操作代碼耦合,而使用Spring事務(wù)管理策略恰好可以避免這種尷尬,Spring的事務(wù)管理提供了兩種方式:編程式事務(wù)管理和聲明式事務(wù)管理,這篇文章主要給大家介紹了關(guān)于Spring事務(wù)是如何管理的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • java高并發(fā)下解決AtomicLong性能瓶頸方案LongAdder

    java高并發(fā)下解決AtomicLong性能瓶頸方案LongAdder

    這篇文章主要為大家介紹了java高并發(fā)下解決AtomicLong性能瓶頸方案LongAdder,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 淺談Spring Bean的基本配置

    淺談Spring Bean的基本配置

    這篇文章主要介紹了淺談Spring Bean的基本配置,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java Spring的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • 詳解MyBatis逆向工程

    詳解MyBatis逆向工程

    本篇文章主要介紹了詳解MyBatis逆向工程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Java實(shí)現(xiàn)將漢字轉(zhuǎn)化為漢語(yǔ)拼音的方法

    Java實(shí)現(xiàn)將漢字轉(zhuǎn)化為漢語(yǔ)拼音的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)將漢字轉(zhuǎn)化為漢語(yǔ)拼音的方法,實(shí)例演示了Java引用pinyin4j庫(kù)實(shí)現(xiàn)漢子轉(zhuǎn)化成拼音的使用技巧,需要的朋友可以參考下
    2015-12-12
  • Mybatis批量刪除數(shù)據(jù)操作方法

    Mybatis批量刪除數(shù)據(jù)操作方法

    MyBatis的作用我想不用多說(shuō),今天說(shuō)說(shuō)MyBatis中的批量刪除操作。 非常不錯(cuò),感興趣的朋友一起看看吧
    2016-09-09
  • Java中日期時(shí)間的用法總結(jié)

    Java中日期時(shí)間的用法總結(jié)

    在日常開發(fā)中,我們經(jīng)常需要處理日期和時(shí)間,所以這篇文章小編為大家總結(jié)了下?Java?中日期與時(shí)間的基本概念與一些常用的用法,希望對(duì)大家有所幫助
    2023-09-09
  • 一文搞懂Java中的線程安全與線程同步

    一文搞懂Java中的線程安全與線程同步

    線程安全指在被多個(gè)線程訪問(wèn)時(shí),程序可以持續(xù)進(jìn)行正確的處理。線程同步是指程序中用于控制不同線程間操作發(fā)生相對(duì)順序的機(jī)制。本文將通過(guò)示例詳細(xì)為大家講講二者的使用,需要的可以參考一下
    2022-06-06
  • Java實(shí)現(xiàn)的生成二維碼和解析二維碼URL操作示例

    Java實(shí)現(xiàn)的生成二維碼和解析二維碼URL操作示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的生成二維碼和解析二維碼URL操作,結(jié)合實(shí)例形式分析了Java創(chuàng)建與解析二維碼,以及文件讀寫等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • JAVA中JNI的簡(jiǎn)單使用分享

    JAVA中JNI的簡(jiǎn)單使用分享

    這篇文章介紹了JAVA中JNI的簡(jiǎn)單使用,有需要的朋友可以參考一下
    2013-10-10

最新評(píng)論