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

Java中的線程生命周期核心概念

 更新時(shí)間:2022年06月09日 11:39:43   作者:?sofia??  
這篇文章主要介紹了Java中的線程生命周期核心概念,通過(guò)使用一個(gè)快速的圖解展開文章內(nèi)容,需要的小伙伴可以參考一下

前言:

在本文中,我們將詳細(xì)討論Java中的一個(gè)核心概念——線程的生命周期。我們將使用一個(gè)快速的圖解,當(dāng)然還有實(shí)用的代碼片段來(lái)更好地理解線程執(zhí)行期間的這些狀態(tài)。

Java多線程

在Java語(yǔ)言中,多線程是由線程的核心概念驅(qū)動(dòng)的。線程在其生命周期中會(huì)經(jīng)歷各種狀態(tài):

Java中線程的生命周期

java.lang.Thread類包含一個(gè)靜態(tài)枚舉,它定義了它的潛在狀態(tài)。在任何給定的時(shí)間點(diǎn)內(nèi),線程只能處于以下狀態(tài)之一:

  • NEW – 一個(gè)新創(chuàng)建的線程,尚未開始執(zhí)行
  • RUNNABLE – 正在運(yùn)行或準(zhǔn)備執(zhí)行,但它正在等待資源分配
  • BLOCKED – 等待獲取監(jiān)視器鎖以進(jìn)入或重新進(jìn)入同步塊/方法
  • WAITING – 等待其他線程執(zhí)行特定操作,無(wú)任何時(shí)間限制
  • TIMED_WAITING – 等待其他線程在指定時(shí)間段內(nèi)執(zhí)行特定操作
  • TERMINATED – 已完成執(zhí)行

上圖涵蓋了所有這些狀態(tài);現(xiàn)在讓我們?cè)敿?xì)討論其中的每一項(xiàng)。

NEW

新線程(或出生線程)是已創(chuàng)建但尚未啟動(dòng)的線程。在我們使用start()方法啟動(dòng)它之前,它一直保持此狀態(tài)。

以下代碼段顯示了新創(chuàng)建的處于新狀態(tài)的線程:

Runnable runnable = new NewState();
Thread t = new Thread(runnable);
Log.info(t.getState());

由于我們尚未啟動(dòng)上述線程,因此方法t.getState()會(huì)打印:

NEW

Runnable

當(dāng)我們創(chuàng)建了一個(gè)新線程并對(duì)其調(diào)用start()方法時(shí),它將從NEW狀態(tài)移動(dòng)到RUNNABLE狀態(tài)。處于此狀態(tài)的線程正在運(yùn)行或準(zhǔn)備運(yùn)行,但它們正在等待來(lái)自系統(tǒng)的資源分配。

在多線程環(huán)境中,線程調(diào)度程序(JVM的一部分)為每個(gè)線程分配固定的時(shí)間量。因此,它會(huì)運(yùn)行一段特定的時(shí)間,然后將控制權(quán)交給其他可運(yùn)行的線程。

例如,讓我們將t.start()方法添加到前面的代碼中,并嘗試訪問(wèn)其當(dāng)前狀態(tài):

Runnable runnable = new NewState();
Thread t = new Thread(runnable);
t.start();
Log.info(t.getState());

此代碼很可能返回以下輸出:

RUNNABLE

請(qǐng)注意:在本例中,并不總是保證在控件到達(dá)t.getState()時(shí),它仍處于可運(yùn)行狀態(tài)。

線程調(diào)度器可能會(huì)立即對(duì)其進(jìn)行調(diào)度,并可能完成執(zhí)行。在這種情況下,我們可能會(huì)得到不同的輸出。

Blocked

當(dāng)前沒(méi)有資格運(yùn)行的線程處于阻塞狀態(tài)。它在等待監(jiān)視器鎖定并嘗試訪問(wèn)被其他線程鎖定的代碼段時(shí)進(jìn)入此狀態(tài)。

讓我們嘗試重現(xiàn)這種狀態(tài):

public class BlockedState {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new DemoThreadB());
        Thread t2 = new Thread(new DemoThreadB());
        t1.start();
        t2.start();
        
        Thread.sleep(1000);
        
        Log.info(t2.getState());
        System.exit(0);
    }
}
class DemoThreadB implements Runnable {
    @Override
    public void run() {
        commonResource();
    }
    
    public static synchronized void commonResource() {
        while(true) {
            // Infinite loop to mimic heavy processing
            // 't1' won't leave this method
            // when 't2' try to enter this
        }
    }
}

在此代碼中:

  • 我們創(chuàng)建了兩個(gè)不同的線程—t1t2
  • t1啟動(dòng)并進(jìn)入synchronized commonResource()方法;這意味著只有一個(gè)線程可以訪問(wèn)它;在當(dāng)前線程完成處理之前,將阻止嘗試訪問(wèn)此方法的所有其他后續(xù)線程進(jìn)一步執(zhí)行
  • 當(dāng)t1進(jìn)入此方法時(shí),它將保持在無(wú)限while循環(huán)中;這只是為了模擬繁重的處理,以便所有其他線程都無(wú)法進(jìn)入此方法
  • 現(xiàn)在,當(dāng)我們啟動(dòng)t2時(shí),它嘗試進(jìn)入commonResource()方法,t1已經(jīng)訪問(wèn)了該方法,因此t2將保持在阻塞狀態(tài)

處于這種狀態(tài),我們稱之為t2.getState()并獲取輸出,如下所示:

BLOCKED

Waiting

線程在等待其他線程執(zhí)行特定操作時(shí)處于等待狀態(tài)。

根據(jù)JavaDocs,任何線程都可以通過(guò)調(diào)用以下三種方法中的任何一種進(jìn)入這種狀態(tài):

  • object.wait()
  • thread.join()
  • LockSupport.park()

請(qǐng)注意,在wait()join()中,我們沒(méi)有定義任何超時(shí)時(shí)間,因?yàn)橄乱还?jié)將介紹該場(chǎng)景。

現(xiàn)在,讓我們嘗試重現(xiàn)這種狀態(tài):

public class WaitingState implements Runnable {
    public static Thread t1;

    public static void main(String[] args) {
        t1 = new Thread(new WaitingState());
        t1.start();
    }
    public void run() {
        Thread t2 = new Thread(new DemoThreadWS());
        t2.start();

        try {
            t2.join();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            Log.error("Thread interrupted", e);
        }
    }
}
class DemoThreadWS implements Runnable {
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            Log.error("Thread interrupted", e);
        }
        
        Log.info(WaitingState.t1.getState());
    }
}

讓我們討論一下我們?cè)谶@里做什么:

  • 我們已經(jīng)創(chuàng)建并啟動(dòng)了t1
  • t1創(chuàng)建t2并啟動(dòng)它
  • 當(dāng)t2的處理繼續(xù)時(shí),我們稱之為t2.join(),這會(huì)使t1處于等待狀態(tài),直到t2完成執(zhí)行
  • 因?yàn)?code>t1正在等待t2完成,所以我們調(diào)用t1.getState()來(lái)自t2

正如您所期望的那樣,這里的輸出是:

WAITING

Timed Waiting

當(dāng)線程等待另一個(gè)線程在規(guī)定的時(shí)間內(nèi)執(zhí)行特定操作時(shí),該線程處于TIMED_WAITING狀態(tài)。

根據(jù)JavaDocs,有五種方法可以將線程置于TIMED_WAITING狀態(tài):

  • thread.sleep(long millis)
  • wait(int timeout) 或 wait(int timeout, int nanos)
  • thread.join(long millis)
  • LockSupport.parkNanos
  • LockSupport.parkUntil

現(xiàn)在,讓我們嘗試快速重現(xiàn)這種狀態(tài):

public class TimedWaitingState {
    public static void main(String[] args) throws InterruptedException {
        DemoThread obj1 = new DemoThread();
        Thread t1 = new Thread(obj1);
        t1.start();
        
        // The following sleep will give enough time for ThreadScheduler
        // to start processing of thread t1
        Thread.sleep(1000);
        Log.info(t1.getState());
    }
}
class DemoThread implements Runnable {
    @Override
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            Log.error("Thread interrupted", e);
        }
    }
}

這里,我們創(chuàng)建并啟動(dòng)了一個(gè)線程t1,該線程進(jìn)入睡眠狀態(tài),超時(shí)時(shí)間為5秒;

輸出將為:

TIMED_WAITING

Terminated

這是死線程的狀態(tài)。當(dāng)它完成執(zhí)行或異常終止時(shí),它處于終止?fàn)顟B(tài)。

讓我們?cè)谝韵率纠袊L試實(shí)現(xiàn)此狀態(tài):

public class TerminatedState implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new TerminatedState());
        t1.start();
        // The following sleep method will give enough time for 
        // thread t1 to complete
        Thread.sleep(1000);
        Log.info(t1.getState());
    }
    
    @Override
    public void run() {
        // No processing in this block
    }
}

在這里,雖然我們已經(jīng)啟動(dòng)了線程t1,但它是下一個(gè)語(yǔ)句Thread.sleep(1000)為t1提供了足夠的時(shí)間來(lái)完成,因此該程序?yàn)槲覀兲峁┤缦螺敵觯?/p>

TERMINATED

除了線程狀態(tài)之外,我們還可以檢查isAlive()方法以確定線程是否處于活動(dòng)狀態(tài)。例如,如果我們?cè)诖司€程上調(diào)用isAlive()方法:

Assert.assertFalse(t1.isAlive());

結(jié)論

在本文中,我們學(xué)習(xí)了Java中線程的生命周期。我們查看了線程定義的所有六個(gè)狀態(tài)。陳述enum并用快速示例再現(xiàn)它們。雖然代碼片段在幾乎每臺(tái)機(jī)器上都會(huì)給出相同的輸出,但在某些例外情況下,我們可能會(huì)得到一些不同的輸出,因?yàn)闊o(wú)法確定線程調(diào)度器的確切行為。

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

相關(guān)文章

  • Maven deploy plugin使用方式

    Maven deploy plugin使用方式

    這篇文章主要介紹了Maven deploy plugin使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 關(guān)于LocalDateTime使用詳解

    關(guān)于LocalDateTime使用詳解

    這篇文章主要介紹了關(guān)于LocalDateTime使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 用Java將字符串的首字母轉(zhuǎn)換大小寫

    用Java將字符串的首字母轉(zhuǎn)換大小寫

    在項(xiàng)目開發(fā)的時(shí)候會(huì)需要統(tǒng)一字符串的格式,比如首字母要求統(tǒng)一大寫或小寫,那用Java如何實(shí)現(xiàn)這一功能?下面一起來(lái)學(xué)習(xí)學(xué)習(xí)。
    2016-08-08
  • SpringBoot分離打Jar包的兩種配置方式

    SpringBoot分離打Jar包的兩種配置方式

    這篇文章主要介紹了SpringBoot分離打Jar包的兩種配置方式,方式一是基于maven-jar-plugin,方式二是基于spring-boot-maven-plugin,文中結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 妙解Java中的回調(diào)機(jī)制(CallBack)

    妙解Java中的回調(diào)機(jī)制(CallBack)

    本文以最簡(jiǎn)明扼要的例子將Java的回調(diào)機(jī)制介紹給大家,感興趣的朋友可以參考一下。
    2016-07-07
  • 如何用idea數(shù)據(jù)庫(kù)編寫快遞e站

    如何用idea數(shù)據(jù)庫(kù)編寫快遞e站

    這篇文章主要介紹了如何用idea數(shù)據(jù)庫(kù)編寫快遞e站,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot實(shí)現(xiàn)多個(gè)子域共享cookie的示例

    SpringBoot實(shí)現(xiàn)多個(gè)子域共享cookie的示例

    本文主要介紹了SpringBoot實(shí)現(xiàn)多個(gè)子域共享cookie的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Spring-AOP-ProceedingJoinPoint的使用詳解

    Spring-AOP-ProceedingJoinPoint的使用詳解

    這篇文章主要介紹了Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 對(duì)arraylist中元素進(jìn)行排序?qū)嵗a

    對(duì)arraylist中元素進(jìn)行排序?qū)嵗a

    這篇文章主要介紹了對(duì)arraylist中元素進(jìn)行排序?qū)嵗a,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • Java實(shí)現(xiàn)爬取往期所有雙色球開獎(jiǎng)結(jié)果功能示例

    Java實(shí)現(xiàn)爬取往期所有雙色球開獎(jiǎng)結(jié)果功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)爬取往期所有雙色球開獎(jiǎng)結(jié)果功能,涉及Java網(wǎng)頁(yè)抓取、正則替換、文件讀寫等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07

最新評(píng)論

承德市| 年辖:市辖区| 辽阳县| 土默特左旗| 荣成市| 盘锦市| 白银市| 旺苍县| 沁源县| 北海市| 北川| 体育| 霍林郭勒市| 平远县| 汤原县| 昌江| 海盐县| 凌云县| 泽州县| 密云县| 香港| 台南县| 景德镇市| 启东市| 清水县| 古田县| 石台县| 弥勒县| 岑巩县| 兴国县| 客服| 略阳县| 吉隆县| 辽中县| 南昌市| 临泽县| 循化| 牡丹江市| 达孜县| 祥云县| 尖扎县|