国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java線程生命周期詳解

這篇具有很好參考價值的文章主要介紹了Java線程生命周期詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

Java中的線程生命周期是多線程開發(fā)的核心概念。了解線程的生命周期以及它們?nèi)绾芜M行狀態(tài)轉(zhuǎn)換對于編寫有效且無錯誤的多線程程序至關(guān)重要。

一、線程的生命周期

Java線程主要有以下幾個狀態(tài),這些狀態(tài)定義在Thread.State枚舉類中:

  1. 新建狀態(tài)(New):當(dāng)我們創(chuàng)建一個新的線程實例時,線程就處于新建狀態(tài)。這時候線程的start()方法還未被調(diào)用,線程對象還未開始執(zhí)行。在這個狀態(tài)下,Java虛擬機(JVM)已經(jīng)為此線程分配了必要的內(nèi)存。

    Thread t = new Thread(); // 線程此時處于New狀態(tài)
    
  2. 就緒狀態(tài)(Runnable):當(dāng)線程對象調(diào)用了start()方法后,該線程就處于就緒狀態(tài)。就緒狀態(tài)的線程在獲得CPU時間片后就可以開始運行。這個狀態(tài)的線程位于可運行線程池中,等待被線程調(diào)度選中,獲得CPU的使用權(quán)。

    t.start(); // 線程此時處于Runnable狀態(tài)
    
  3. 運行狀態(tài)(Running):線程獲取到CPU時間片后,就進入運行狀態(tài),開始執(zhí)行run()方法中的代碼。值得注意的是,代碼執(zhí)行的實際速度和效率與處理器的速度以及多核處理器的核數(shù)有關(guān)。

    public void run() {
        System.out.println("Thread is running.");
    }
    // 如果此時這個方法正在執(zhí)行,那么線程就處于Running狀態(tài)
    
  4. 阻塞狀態(tài)(Blocked):當(dāng)一個線程試圖獲取一個內(nèi)部的對象鎖(也就是進入一個synchronized塊),而該鎖被其他線程持有,則該線程進入阻塞狀態(tài)。阻塞狀態(tài)的線程在鎖被釋放時,將會進入就緒狀態(tài)。

    synchronized(object) {
        // 如果此時object的鎖被其他線程持有,那么線程就處于Blocked狀態(tài)
    }
    
  5. 等待狀態(tài)(Waiting):線程通過調(diào)用其自身的wait()方法、join()方法或LockSupport.park()方法,或者通過調(diào)用其他線程的join()方法,可以進入等待狀態(tài)。在等待狀態(tài)的線程不會被分配CPU時間片,它們只能通過被其他線程顯式喚醒進入就緒狀態(tài)。

    t.wait();  // 線程此時處于Waiting狀態(tài)
    t.join();  // 線程此時處于Waiting狀態(tài)
    
  6. 超時等待狀態(tài)(Timed Waiting):當(dāng)線程調(diào)用了sleep(long ms),wait(long ms),join(long ms),或者LockSupport.parkNanos(), LockSupport.parkUntil()等具有指定等待時間的方法,線程就會進入超時等待狀態(tài)。當(dāng)超時時間到達后,線程會自動返回到就緒狀態(tài)。

    Thread.sleep(1000); // 線程此時處于Timed Waiting狀態(tài)
    
  7. 終止?fàn)顟B(tài)(Terminated):當(dāng)線程的run()方法執(zhí)行完畢,或者線程中斷,線程就會進入終止?fàn)顟B(tài)。在這個狀態(tài)下,線程已經(jīng)完成了它的全部工作。

    // 當(dāng)run()方法執(zhí)行完畢,線程處于Terminated狀態(tài)
    public void run() {
        System.out.println("Thread is running.");
    }
    

這些狀態(tài)之間的轉(zhuǎn)換,通過各種方法的調(diào)用來實現(xiàn)。接下來我們將看到這些狀態(tài)轉(zhuǎn)換的具體情況。

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

Java線程生命周期詳解

線程狀態(tài)的轉(zhuǎn)換是非常重要的一部分,了解狀態(tài)之間的轉(zhuǎn)換有助于我們更好地理解和掌握線程的行為。下面,我們來看看Java中各種線程狀態(tài)的轉(zhuǎn)換情況。

  1. 新建狀態(tài)轉(zhuǎn)就緒狀態(tài):當(dāng)線程對象被創(chuàng)建后,其進入新建狀態(tài)。此時,通過調(diào)用線程對象的start()方法,可以讓線程進入就緒狀態(tài),等待系統(tǒng)的線程調(diào)度器進行調(diào)度。

    Thread t = new Thread(); // 新建狀態(tài)
    t.start(); // 調(diào)用start()方法,線程進入就緒狀態(tài)
    
  2. 就緒狀態(tài)轉(zhuǎn)運行狀態(tài):線程調(diào)度器從就緒隊列中選擇一個線程,分配給它CPU資源,這個線程就由就緒狀態(tài)變?yōu)檫\行狀態(tài)。

  3. 運行狀態(tài)轉(zhuǎn)就緒狀態(tài):當(dāng)一個運行狀態(tài)的線程調(diào)用了yield()方法,或者該線程的運行時間超過了系統(tǒng)規(guī)定的時間片,線程就會釋放CPU資源,自己由運行狀態(tài)變回就緒狀態(tài),重新等待系統(tǒng)調(diào)度。

    Thread.yield(); // 調(diào)用yield()方法,線程從運行狀態(tài)進入就緒狀態(tài)
    
  4. 運行狀態(tài)轉(zhuǎn)阻塞狀態(tài):當(dāng)一個運行狀態(tài)的線程試圖獲取一個被其他線程持有的對象鎖時,該線程就會進入阻塞狀態(tài)。

    synchronized(object) {
        // 如果此時object的鎖被其他線程持有,那么線程就從運行狀態(tài)進入阻塞狀態(tài)
    }
    
  5. 阻塞狀態(tài)轉(zhuǎn)就緒狀態(tài):當(dāng)一個阻塞狀態(tài)的線程獲取到了被其他線程釋放的對象鎖,該線程就由阻塞狀態(tài)變?yōu)榫途w狀態(tài),重新等待系統(tǒng)調(diào)度。

  6. 運行狀態(tài)轉(zhuǎn)等待狀態(tài):當(dāng)一個運行狀態(tài)的線程調(diào)用了wait()join()LockSupport.park()方法時,該線程就會進入等待狀態(tài)。等待狀態(tài)的線程需要依賴其他線程的通知才能夠返回到就緒狀態(tài)。

    t.wait(); // 調(diào)用wait()方法,線程從運行狀態(tài)進入等待狀態(tài)
    t.join(); // 調(diào)用join()方法,線程從運行狀態(tài)進入等待狀態(tài)
    
  7. 等待狀態(tài)轉(zhuǎn)就緒狀態(tài):當(dāng)一個等待狀態(tài)的線程被其他線程調(diào)用notify()notifyAll()喚醒,或者被其他線程中斷,或者等待的時間到期,該線程就由等待狀態(tài)轉(zhuǎn)為就緒狀態(tài)。

    t.notify(); // notify()方法被調(diào)用,線程從等待狀態(tài)進入就緒狀態(tài)
    
  8. 運行狀態(tài)轉(zhuǎn)超時等待狀態(tài):當(dāng)一個運行狀態(tài)的線程調(diào)用了具有超時參數(shù)的sleep()wait(),join(),或LockSupport.parkNanos()LockSupport.parkUntil()方法時,該線程就會進入超時等待狀態(tài)。

    Thread.sleep(1000); // 調(diào)用sleep()方法,線程從運行狀態(tài)進入超時等待狀態(tài)
    
  9. 超時等待狀態(tài)轉(zhuǎn)就緒狀態(tài):當(dāng)一個超時等待狀態(tài)的線程等待的時間到期,或者被其他線程喚醒或中斷,該線程就由超時等待狀態(tài)轉(zhuǎn)為就緒狀態(tài)。

  10. 任何狀態(tài)轉(zhuǎn)終止?fàn)顟B(tài):當(dāng)線程完成任務(wù)或者因異常退出時,就會進入終止?fàn)顟B(tài)。

通過了解以上線程的狀態(tài)轉(zhuǎn)換,可以更加深入理解線程的運行機制,為多線程編程提供理論基礎(chǔ)。

三、線程生命周期示例

下面的Java代碼實例演示了一個線程從創(chuàng)建到終止的整個過程:

// 創(chuàng)建一個繼承了Thread類的ExampleThread類
class ExampleThread extends Thread {
    private Object lock; // 創(chuàng)建一個私有的Object對象,它將在同步代碼塊中被使用作為鎖

    // 構(gòu)造函數(shù),接受一個Object類型的參數(shù)
    public ExampleThread(Object lock) {
        this.lock = lock; // 將傳入的對象賦值給lock
    }

    // 重寫Thread類的run方法
    @Override
    public void run() {
        // 同步代碼塊,只有獲取到lock對象的鎖才能執(zhí)行
        synchronized(lock) {
            try {
                // 輸出線程名和狀態(tài)
                System.out.println(Thread.currentThread().getName() + " is running");
                // 讓線程睡眠1秒,此時線程進入TIMED_WAITING狀態(tài)
                Thread.sleep(1000);

                // 輸出線程名和狀態(tài)
                System.out.println(Thread.currentThread().getName() + " is waiting");
                // 調(diào)用wait()方法,線程釋放lock鎖,進入WAITING狀態(tài)
                lock.wait();

                // 線程被喚醒,獲取到lock鎖,輸出線程名和狀態(tài)
                System.out.println(Thread.currentThread().getName() + " is running again");
            } catch (InterruptedException e) {
                // 線程被中斷,輸出線程名和狀態(tài),然后線程將結(jié)束
                System.out.println(Thread.currentThread().getName() + " is interrupted and will terminate");
            }
        }
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建一個共享的鎖對象
        Object lock = new Object();

        // 創(chuàng)建一個新的線程(NEW狀態(tài))
        Thread t1 = new ExampleThread(lock);
        System.out.println(t1.getName() + " is created");

        // 啟動新的線程(READY/RUNNABLE狀態(tài))
        t1.start();

        // 讓主線程睡眠2秒,這樣新線程就可以先運行
        Thread.sleep(2000);

        // 喚醒等待的線程(將進入READY/RUNNABLE狀態(tài))
        synchronized(lock) {
            lock.notify();
        }

        // 讓主線程再睡眠1秒,這樣被喚醒的線程可以完成運行
        Thread.sleep(1000);
    }
}

這個代碼示例演示了Java線程從創(chuàng)建(NEW狀態(tài)),到就緒和運行(READY/RUNNABLE狀態(tài)),再到等待(WAITING狀態(tài)),被喚醒后再次運行,最后終止(TERMINATED狀態(tài))的整個過程。
以優(yōu)化應(yīng)用的性能。

結(jié)束語

希望以上內(nèi)容能幫助你理解Java線程的生命周期。理解線程生命周期對于編寫并發(fā)程序和進行多線程編程都十分重要。記住,最好的學(xué)習(xí)方法就是動手實踐。因此,我鼓勵大家自己動手嘗試上述代碼,更深入地理解線程生命周期的每個階段。文章來源地址http://www.zghlxwxcb.cn/news/detail-501216.html

到了這里,關(guān)于Java線程生命周期詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 高級進階多線程——多任務(wù)處理、線程狀態(tài)(生命周期)、三種創(chuàng)建多線程的方式

    高級進階多線程——多任務(wù)處理、線程狀態(tài)(生命周期)、三種創(chuàng)建多線程的方式

    Java中的多線程是一個同時執(zhí)行多個線程的進程。線程是一個輕量級的子進程,是最小的處理單元。多進程和多線程都用于實現(xiàn)多任務(wù)處理。 但是,一般使用多線程而不是多進程,這是因為線程使用共享內(nèi)存區(qū)域。它們不分配單獨的內(nèi)存區(qū)域以節(jié)省內(nèi)存,并且線程之間的上下

    2024年02月13日
    瀏覽(25)
  • unity的C#學(xué)習(xí)——多線程編程(線程的生命周期、創(chuàng)建與管理)與線程相關(guān)類

    多線程編程是 C# 一個比較難且涵蓋面比較廣的知識點,本文整理倉促而且屬于筆記向博客,有些地方必然還存在不嚴(yán)謹(jǐn)和錯誤,本人會在日后的使用過程中不斷完善。如果發(fā)現(xiàn)問題或有改進意見可以在評論區(qū)提出,我會及時修改。 線程是程序的執(zhí)行流程,也被稱為 輕量級進

    2024年02月12日
    瀏覽(30)
  • K8s: 關(guān)于Kubernetes中的Pod的生命周期(狀態(tài))以及生命周期的鉤子函數(shù)處理

    pod 的生命周期 1 ) pod 幾種常用狀態(tài) 1.1 )Pending(掛起) Pod 已被 Kubernetes 系統(tǒng)接受,但有一個或者多個容器尚未創(chuàng)建亦未運行 此階段包括等待 Pod 被調(diào)度的時間和通過網(wǎng)絡(luò)下載鏡像的時間。 1.2 )Running(運行中) Pod 已經(jīng)綁定到了某個節(jié)點,Pod 中所有的容器都已被創(chuàng)建 至少有

    2024年04月22日
    瀏覽(40)
  • Angular組件生命周期詳解

    Angular組件生命周期詳解

    當(dāng) Angular 實例化組件類 并渲染組件視圖及其子視圖時,組件實例的生命周期就開始了。生命周期一直伴隨著變更檢測,Angular 會檢查數(shù)據(jù)綁定屬性何時發(fā)生變化,并按需更新視圖和組件實例。當(dāng) Angular 銷毀組件實例并從 DOM 中移除它渲染的模板時,生命周期就結(jié)束了。當(dāng) Ang

    2024年02月05日
    瀏覽(23)
  • HTML頁面生命周期詳解

    在使用vue的時代本次項目有個需求,就是需要在靜態(tài)資源未加載時獲取當(dāng)前頁面的訪問路徑,所以需要對html頁面的生命周期要有所了解。本次講講HTML頁面的生命周期事件,希望對大家有所幫助。如果文中有不對、疑惑的地方,歡迎在評論區(qū)留言指正?? ? 一、HTML頁面的生命

    2024年02月13日
    瀏覽(17)
  • 【Vue】生命周期一文詳解

    【Vue】生命周期一文詳解

    目錄 前言 生命周期 鉤子函數(shù)使用方法 ?編輯 周期-----創(chuàng)建階段 創(chuàng)建階段做了些什么事 該階段可以干什么 周期----掛載階段 掛載階段做了什么事 該階段適合干什么 周期----更新階段 更新階段做了什么事 該階段適合做什么 周期----銷毀階段 銷毀階段做了什么事 該階段適合做

    2024年02月05日
    瀏覽(52)
  • 什么是Vue中的生命周期鉤子函數(shù)?有哪些主要的生命周期鉤子函數(shù)?如何監(jiān)聽DOM事件?

    Vue中的生命周期鉤子函數(shù)是指在Vue實例創(chuàng)建、數(shù)據(jù)綁定、組件掛載等生命周期階段中,可以執(zhí)行一些特定操作的函數(shù)。這些函數(shù)在Vue實例的不同生命周期階段被調(diào)用,可以幫助開發(fā)者更好地控制Vue實例的行為。 Vue的生命周期鉤子函數(shù)包括: beforeCreate :在Vue實例創(chuàng)建之前調(diào)用

    2024年02月12日
    瀏覽(19)
  • Vue生命周期函數(shù)(詳解)

    Vue生命周期函數(shù)(詳解)

    目錄 ?生命周期圖 生命周期函數(shù) beforeCreate和created的區(qū)別 beforeCreate創(chuàng)建前應(yīng)用場景 ?created創(chuàng)建后應(yīng)用場景 beforeMount和mounted的區(qū)別 ?beforeMount掛載前應(yīng)用場景 ?mounted掛載后應(yīng)用場景 ?beforeUpdate和updated的區(qū)別 ?beforeUpdate更新前應(yīng)用場景 ?updated更新后應(yīng)用場景 ?beforeDestroy和des

    2024年02月13日
    瀏覽(24)
  • Vue生命周期詳解學(xué)習(xí)筆記

    Vue生命周期詳解學(xué)習(xí)筆記

    生命周期又名生命周期回調(diào)函數(shù),生命周期函數(shù),生命周期鉤子。 生命周期是Vue在關(guān)鍵時刻幫我們調(diào)用的一些特殊名稱的函數(shù)。 生命周期函數(shù)的名字不可更改,但函數(shù)的具體內(nèi)容是程序員根據(jù)需求編寫的。 生命周期中的this指向vm或組件實例對象。 鉤子函數(shù)用來描述Vue實例從

    2024年02月16日
    瀏覽(25)
  • Vue.js 生命周期詳解

    Vue.js 生命周期詳解

    Vue.js 是一款流行的 JavaScript 框架,它采用了組件化的開發(fā)方式,使得前端開發(fā)更加簡單和高效。在 Vue.js 的開發(fā)過程中,了解和理解 Vue 的生命周期非常重要。本文將詳細(xì)介紹 Vue 生命周期的四個階段:創(chuàng)建、掛載、更新和銷毀。 在創(chuàng)建階段,Vue 實例被創(chuàng)建并初始化。這個階

    2024年02月13日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包