Java中線程的狀態轉換有什么(生命周期)

在Java中,線程的生命周期由六種主要狀態構成,每種狀態都有其特定的轉換條件。以下是Java線程的生命周期狀態及其轉換條件:

線程狀態

  1. 新建(NEW)

    • 線程對象已經創建,但尚未調用start()方法。
    Thread thread = new Thread();
    
  2. 就緒(RUNNABLE)

    • 線程已調用start()方法,等待被線程調度器選中以便運行。需要注意的是,在某些文檔中,這個狀態也被稱為“可運行(RUNNABLE)”,包括實際運行狀態。
    thread.start();
    
  3. 運行(RUNNING)

    • 線程調度器從就緒線程池中選中該線程,并開始執行run()方法中的代碼。
  4. 阻塞(BLOCKED)

    • 線程在等待獲取一個監視器鎖,以便進入同步塊/方法。如果線程在同步代碼塊/方法中等待鎖,它就是阻塞狀態。
    synchronized (lock) {// 線程進入同步塊
    }
    
  5. 等待(WAITING)

    • 線程等待另一線程顯式地喚醒。進入這種狀態有幾種方法:調用Object.wait()Thread.join()、或LockSupport.park(),并且沒有設置超時時間。
    synchronized (lock) {lock.wait(); // 必須在 synchronized 塊內調用
    }
    
  6. 超時等待(TIMED_WAITING)

    • 線程等待一定時間之后會自動喚醒。進入這種狀態的幾種方法包括:Thread.sleep(long millis)Object.wait(long timeout)Thread.join(long millis)LockSupport.parkNanos()、和LockSupport.parkUntil()
    Thread.sleep(1000); // 休眠 1 秒
    
  7. 終止(TERMINATED)

    • 線程已執行完畢或由于異常退出,線程結束生命周期。

狀態轉換

線程在其生命周期中會在不同狀態之間進行轉換,主要的轉換條件如下:

  1. 新建 -> 就緒

    • 調用start()方法。
    Thread thread = new Thread();
    thread.start();
    
  2. 就緒 -> 運行

    • 線程調度器選擇該線程進行執行。
  3. 運行 -> 阻塞

    • 線程嘗試獲取同步鎖,但鎖被其他線程持有。
    synchronized (lock) {// 線程進入阻塞狀態等待鎖
    }
    
  4. 運行 -> 等待

    • 線程調用Object.wait()方法或Thread.join()方法,沒有設置超時。
    synchronized (lock) {lock.wait();
    }
    
  5. 運行 -> 超時等待

    • 線程調用Thread.sleep(long millis)方法、Object.wait(long timeout)方法、或Thread.join(long millis)方法,并設置了超時。
    Thread.sleep(1000);
    
  6. 等待 -> 就緒

    • 其他線程調用Object.notify()Object.notifyAll()方法。
    synchronized (lock) {lock.notify();
    }
    
  7. 超時等待 -> 就緒

    • 超時時間到。
    // 等待時間到后自動進入就緒狀態
    
  8. 阻塞 -> 就緒

    • 線程獲得鎖。
    synchronized (lock) {// 獲得鎖,進入就緒狀態
    }
    
  9. 運行 -> 終止

    • 線程執行完成或拋出未捕獲的異常。
    public void run() {// 執行完畢或拋出異常,線程終止
    }
    

示例代碼

以下是一個簡單的示例代碼,演示了線程在不同狀態之間的轉換:

public class ThreadLifecycleDemo {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {try {System.out.println("Thread State: " + Thread.currentThread().getState()); // RUNNABLEThread.sleep(1000);synchronized (ThreadLifecycleDemo.class) {ThreadLifecycleDemo.class.wait();}} catch (InterruptedException e) {e.printStackTrace();}});System.out.println("Thread State after creation: " + thread.getState()); // NEWthread.start();System.out.println("Thread State after start: " + thread.getState()); // RUNNABLEThread.sleep(500);System.out.println("Thread State while sleeping: " + thread.getState()); // TIMED_WAITINGsynchronized (ThreadLifecycleDemo.class) {ThreadLifecycleDemo.class.notify();}Thread.sleep(500);System.out.println("Thread State after notify: " + thread.getState()); // TERMINATED}
}

在上述示例中,通過打印線程的狀態,可以觀察到線程在其生命周期中的狀態變化。了解這些狀態和轉換條件對于編寫并發程序和調試多線程問題非常重要。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35411.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Stable Diffusion——SDXL 1.0原理解析

1. SDXL 1.0 簡介 SDXL 1.0是Stability AI推出的新基礎模型,作為Stable Diffusion的大幅改進版本,它是一個用于文本到圖像合成的潛在擴散模型(LDM)。作為Stable Diffusion的最新進化,它正在超越其前身,并與…

錄制視頻怎么操作?手把手教會你!

在這個互聯網科技高速發展的時代,錄制視頻已經成為了人們生活中一個不可或缺的技能。無論是記錄游戲精彩瞬間、制作教程、分享生活趣事,還是進行在線教學,錄制視頻都是一種非常直觀有效的方式。可是錄制視頻怎么操作呢?本文將介紹…

駐馬店建筑工程設計資質變更操作要點

150資質變更操作要點: 3806變更原因:若因企業重組、合并、分立、跨省變更等原因導致企業名稱、法定代表人、注冊地址、經濟性質、注冊資本、經營范圍等發生變動,應及時申請資質變更。 1686 變更申請:提交資質變更申請書及…

算法學習筆記——單雙鏈表及其反轉—堆棧詮釋

單雙鏈表及其反轉——堆棧詮釋 按值傳遞 int、long、byte、short、char、float、double、boolean和String 都是按值傳遞 概念:在方法被調用時,實參通過形參把它的內容副本傳入方法內部,此時形參接收到的內容是實參值的一個拷貝,…

Makefile中eval函數的用法

Makefile中eval函數的用法 一,eval函數的使用方法:二,eval函數的優勢 一,eval函數的使用方法: 在Makefile中,eval 函數的作用是用來動態地執行Makefile中的命令或賦值操作。它的基本語法如下: …

Spring MVC數據綁定和響應——簡單數據綁定(三)POJO綁定

一、POJO數據綁定的使用場景 在使用簡單數據類型綁定時,可以很容易的根據具體需求來定義方法中的形參類型和個數,然而在實際應用中,客戶端請求可能會傳遞多個不同類型的參數數據,如果還使用簡單數據類型進行綁定,那么就…

adb shell執行定時2小時命令

在Android設備上使用adb shell來執行一個定時2小時后運行的命令并不直接支持,因為adb shell是即時執行shell命令的工具,不支持內置的定時任務功能。但是,你可以通過幾種方法來實現類似的功能: 方法一:使用sleep命令 …

dbeaver數據庫鏈接工具

1、下載dbeaver 一個綠色版一個安裝版,官網開源版 2、安裝 3、可以導入之前navicat的鏈接 導入 選擇navicat 反編譯密碼的:https://tool.lu/coderunner navicat 版本15的密碼解密:https://www.iatodo.com/navicatpw

css動畫自定義動畫間隔時間

function playAnimation(element) {var animationName rubberBand;var duration 2000; // 動畫持續時間,單位為毫秒element.style.animation ${animationName} 1s ease;element.addEventListener(animationend, function() {// 動畫結束后重置樣式,以…

服務運營 | MS文章精選:線上點單,當真免排隊?餐飲零售與醫療場景中的全渠道運營

編者按: 小A走進了一家奶茶店,準備向店員點單,但卻在屏幕上看到還有98杯奶茶待制作(因為線上訂單突然暴增)。因此,小A不滿地嘟囔著離開了奶茶店。這個例子展示了線上渠道可能會對線下渠道造成一些負面影響…

使用AES,前端加密,后端解密,spring工具類了

學習python的時候,看到很多會對參數進行加密,于是好奇心驅使下,讓我去了解了下AES加密如何在java中實現。 首先 npm install crypto-js 然后在你的方法中,給你們前端源碼看看,因為我用的ruoyi框架做的實驗&#xff…

四川音盛佳云電子商務有限公司抖音電商的先行者

在當今數字時代,電商行業風起云涌,各大平臺競相爭奪市場份額。而在這其中,四川音盛佳云電子商務有限公司以其獨特的抖音電商服務模式,悄然崛起,成為了行業中的一股不可忽視的力量。今天,就讓我們一起走進音…

【GD32F303紅楓派使用手冊】第二十六節 EXMC-液晶驅動實驗

26.1 實驗內容 通過本實驗主要學習以下內容: LCD顯示原理 EXMC NOR/SRAM模式時序和8080并口時序 LCD顯示控制 26.2 實驗原理 使用MCU的EXMC外設實現8080并口時序,和TFT-LCD控制器進行通信,控制LCD顯示圖片、字符、色塊等。 26.2.1 TFT…

圖像超分辨率重建

一、什么是圖像超分辨 圖像超分辨是一種技術,旨在通過硬件或軟件的方法提高原有圖像的分辨率。這一過程涉及從一系列低分辨率的圖像中獲取一幅高分辨率的圖像,實現了時間分辨率向空間分辨率的轉換。超分辨率重建的核心思想是利用多幀圖像序列的時間帶寬來…

計算機畢業設計Thinkphp/Laravel學生考勤管理系統zyoqy

管理員登錄學生考勤管理系統后,可以對首頁、個人中心、公告信息管理、年級管理、專業管理、班級管理、學生管理、教師管理、課程信息管理、學生選課管理、課程簽到管理、請假申請管理、銷假申請管理等功能進行相應操作,如圖5-2所示。學生登錄進入學生考勤…

金蝶云蒼穹考試題目大全

前言 受不了某些地方看個答案還要收費,總結多份試卷 題目有重復,關鍵字檢索即可 試卷一 金蝶云蒼穹考試題目大全 單選題 開發知識錯題反饋1.0分 1.關于編碼規則的適用范圍說法錯誤的是 A.單據沒有設置主業務組織的情況下,則校驗用戶當前登…

【Spine學習16】之 人物面部綁定

1、創建頭部骨骼 一根頭骨 以頭骨為父結點創建一個面部控制器face-holder 2、創建頭發和face面部控制結點的變換約束 左右頭發的約束指向為face結點 3、設定后發的變換約束,約束指向為face結點,反方向移動 設置參數為-100 同理,耳朵也依…

C# 中的 App.manifest 文件:優化應用程序配置與權限管理

前言 在開發 C# 應用程序時,可能會忽略一個重要的文件——App.manifest。這個文件看似不起眼,卻在應用程序的運行和用戶體驗上扮演著關鍵角色。了解和正確配置 App.manifest 文件,不僅可以確保應用程序在不同操作系統上的兼容性,…

解決uniapp,textarea拉起頁面被頂起和鍵盤被輸入框遮擋的問題。

1:Android、ios 同時解決; 2:我們在開發的時候會發現textarea或者input拉起鍵盤的時候整個頁面被頂起了,header也被頂沒了;官方給了:adjustPositionfalse屬性,設置完之后頁面就不會被頂起,但是…

談談SQL優化

SQL優化是數據庫性能優化中的關鍵環節,旨在提高查詢執行的效率和響應速度。下面是一些常見的SQL優化技巧和策略,涵蓋索引、查詢設計、表結構設計等方面: 1. 索引優化 創建索引:為常用查詢的過濾條件(WHERE 子句&…