Java線程狀態及其流轉

在Java編程中,線程是一種重要的并發實體。為了更好地理解和管理多線程應用程序,我們需要清楚線程的不同狀態及其流轉機制。本文將詳細介紹Java中線程的幾種主要狀態以及它們之間的轉換關系。

一、線程狀態概述

Java線程的生命周期有多個狀態,主要包括以下幾種:

  1. 新建狀態(New)
  2. 就緒狀態(Runnable)
  3. 運行狀態(Running)
  4. 阻塞狀態(Blocked)
  5. 等待狀態(Waiting)
  6. 超時等待狀態(Timed Waiting)
  7. 終止狀態(Terminated)

每一種狀態代表著線程在其生命周期中的不同階段,下面我們將逐一解析每個狀態以及狀態之間的流轉。

二、各線程狀態詳解

1. 新建狀態(New)

當創建一個線程對象時,該線程處于新建狀態,此時線程尚未開始執行。只有當你調用 start() 方法時,新建狀態的線程才能進入就緒狀態。

示例代碼

Thread thread = new Thread(() -> {System.out.println("線程正在執行...");
});

2. 就緒狀態(Runnable)

新建狀態的線程在調用 start() 方法后進入就緒狀態。此時線程處于等待系統調度的狀態,準備好隨時啟動執行。

示例代碼

thread.start(); // 線程進入就緒狀態

注意:就緒狀態的線程不一定在運行,它只是等待線程調度器分配CPU時間。

3. 運行狀態(Running)

當線程被分配到CPU時,線程進入運行狀態。此時,線程正在執行它的任務。

  • 線程從就緒狀態轉換為運行狀態是由線程調度器決定的。
  • 運行狀態的線程可能會因為時間片用盡、調用 wait()sleep() 方法或由于其他線程搶占等原因而轉移到其他狀態。

4. 阻塞狀態(Blocked)

阻塞狀態的線程是因為嘗試獲取鎖(synchronized)而被阻塞。當兩個或多個線程需要相同的資源(例如一個對象的鎖)時,只有獲得鎖的線程才能執行,而其他線程會被阻塞。

示例代碼

synchronized (someObject) {// 執行的代碼
}

如果另一個線程已經持有 someObject 的鎖,則當前線程會進入阻塞狀態,直到能夠獲取鎖為止。

5. 等待狀態(Waiting)

線程進入等待狀態通常是由于調用了以下方法之一:

  • Object.wait()
  • Thread.join()
  • LockSupport.park()

在等待狀態下的線程不會被線程調度器選中執行,直到其他線程調用 notify()notifyAll() 或者 join() 的線程結束。

示例代碼

synchronized (someObject) {someObject.wait(); // 進入等待狀態
}

6. 超時等待狀態(Timed Waiting)

超時等待狀態是一種特殊的等待狀態,線程等待某個條件但設定了超時時間。線程會在等待時間結束后自動恢復到就緒狀態。

例如,線程調用 Thread.sleep(millis)Object.wait(millis)

示例代碼

Thread.sleep(1000); // 線程等待1秒

7. 終止狀態(Terminated)

當線程的 run() 方法執行完畢,或者因為未處理異常而終止時,線程進入終止狀態。此狀態的線程無法再重新啟動。

示例代碼

public void run() {// 執行的代碼
} // 線程執行到此,進入終止狀態

線程一旦進入終止狀態,它的生命周期就結束了。

三、線程狀態流轉

下面是一個詳細的表格,內容包括線程狀態、狀態轉換、觸發條件以及實例代碼說明。這個表格將幫助你更清晰地理解Java中線程的狀態及其轉換過程。

線程狀態狀態描述狀態轉換觸發條件示例代碼
新建(New)線程對象被創建,但尚未啟動。調用 start() 方法調用 Thread t = new Thread()Thread t = new Thread();
就緒(Runnable)線程已啟動,準備執行,但 CPU 未分配給它。由線程調度器分配 CPU 或調用 yield()調用 start() 后,等待 CPU 調度t.start();
運行(Running)線程正在執行任務。調度器分配 CPU 資源,或因時間片用盡被搶占CPU 調度// 代碼在 run() 方法中執行
阻塞(Blocked)線程等待獲取其他線程持有的鎖。獲取鎖成功,或其他條件通知當前線程調用了 synchronized,但未獲取鎖synchronized(lock) { ... }
等待(Waiting)線程等待其他線程通知。由其他線程調用 notify()notifyAll()調用 wait()join()lock.wait();
超時等待(Timed Waiting)線程等待某個條件,但設定了超時時間。超時結束,或被調用 notify()調用 Thread.sleep(millis)wait(millis)Thread.sleep(1000);
終止(Terminated)線程生命周期結束。無法再轉換,無論是正常結束還是異常run() 方法執行完畢或拋出未處理的異常public void run() { ... }

狀態轉換詳細說明

  1. 新建(New)→ 就緒(Runnable)

    • 條件:調用 start() 方法,使線程準備執行。
    • 示例代碼
      Thread thread = new Thread(() -> { /* 執行的任務 */ });thread.start();  // 線程從新建狀態轉到就緒狀態
      
  2. 就緒(Runnable)→ 運行(Running)

    • 條件:線程調度器將 CPU 時間片分配給線程,使其進入運行狀態。
    • 示例:后臺執行的任務,調度器根據優先級選擇線程。
  3. 運行(Running)→ 阻塞(Blocked)

    • 條件:線程嘗試訪問 synchronized 塊或方法時,發現已被其他線程占用。
    • 示例代碼
      synchronized(lock) {    // 訪問被鎖住的資源}
      
  4. 運行(Running)→ 等待(Waiting)

    • 條件:調用 wait()join()LockSupport.park(),進入等待狀態。
    • 示例代碼
      synchronized (lock) {    lock.wait(); // 進入等待狀態,直到有其他線程調用notify}
      
  5. 運行(Running)→ 超時等待(Timed Waiting)

    • 條件:調用帶有時間參數的方法,如 Thread.sleep(millis)wait(millis)
    • 示例代碼
      Thread.sleep(1000); // 線程暫停1秒進入超時等待狀態
      
  6. 阻塞(Blocked)→ 就緒(Runnable)

    • 條件:成功獲取鎖,線程重新進入就緒狀態,等待 CPU 調度。
    • 示例:當鎖被釋放后,阻塞的線程嘗試獲取鎖,成功時轉為就緒狀態。
  7. 等待(Waiting)→ 就緒(Runnable)

    • 條件:其他線程調用了 notify()notifyAll(),喚醒等待線程。
    • 示例代碼
      // 在另一個線程synchronized (lock) {    lock.notify(); // 喚醒一個等待的線程}
      
  8. 超時等待(Timed Waiting)→ 就緒(Runnable)

    • 條件:等待超時到達,線程自動恢復就緒狀態。
    • 示例:如上所示的 Thread.sleep 達到指定時間。
  9. 運行(Running)→ 終止(Terminated)

    • 條件:線程執行完畢,或者拋出未捕獲的異常,線程自然結束。
    • 示例代碼
      public void run() {    // 一些代碼}  // 代碼完成或拋出異常則終止
      

四、總結

了解Java線程的各個狀態及其流轉機制是掌握并發編程的基礎。通過清晰的狀態流轉關系,可以幫助我們更有效地管理和調試多線程應用程序。希望本文能幫助到你在多線程編程中的學習與應用。

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

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

相關文章

LabVIEW雙光子顯微鏡開發

基于LabVIEW 開發高性能雙光子顯微鏡系統,聚焦于生物樣本深層成像與納米材料三維表征。實現了超快激光控制、多維數據采集與實時圖像重建。系統采用飛秒激光光源與高精度振鏡掃描模塊,結合 LabVIEW 的 FPGA 實時控制能力,可對活體組織、熒光納…

數據庫操作-MySQL-4(JDBC編程)

JDBC:通過Java代碼操作mysql數據庫,數據庫會提供一些API供我們調用 MySQL、Oracle、等API有差異,但是Java統一了所有接口,即JDBC; 原始api-驅動包(類似轉接頭)-統一的api-Java 驅動包&#xff1…

windows修改躍點數調整網絡優先級

Windows有兩個網卡,一個有線網卡,一個無線網卡,通過修改躍點數來調整優先使用的網卡,這種只是眾多設置方式中的其中一種設置方式 文檔編寫時間:2025年6月 1.打開電腦的網絡連接 cmd--ncpa.cpl 在cmd中運行ncpa.cpl可…

實驗設計與分析(第6版,Montgomery著,傅玨生譯) 第10章擬合回歸模型10.9節思考題10.1 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第10章擬合回歸模型10.9節思考題10.1 R語言解題。主要涉及線性回歸、回歸的顯著性、回歸系數的置信區間。 vial <- seq(1, 10, 1) Viscosity <- c(160,171,175,182,184,181,188,19…

【深入 LangChain 的 Model I/O】提示設計、模型調用與輸出解析全解析

目錄 什么是 Model I/O&#xff1f; 一、提示模板&#xff08;PromptTemplate&#xff09; 1.1 什么是提示模板&#xff1f; 1.2 常見提示模板類型 二、模型調用&#xff08;Model Predict&#xff09; 三、輸出解析&#xff08;Output Parser&#xff09; 綜合示例&…

OD 算法題 B卷【跳格子2】

文章目錄 跳格子2 跳格子2 小明和朋友玩跳格子游戲&#xff0c;有n個連續格子組成的圓圈&#xff0c;每個格子有不同的分數&#xff0c;小朋友可以選擇從任意格子起跳&#xff0c;但是不能跳連續的格子&#xff0c;不能回頭跳&#xff0c;也不能超過一圈&#xff0c;給定一個代…

客戶線索商機怎么管?客戶線索商機管理工具哪個好?

做銷售、搞運營的朋友肯定都有過這種煩惱&#xff1a;每天收到海量客戶線索&#xff0c;卻不知道從哪條開始跟進&#xff1b;試了好幾個管理工具&#xff0c;要么功能太復雜&#xff0c;要么用起來不趁手。其實選對客戶線索商機管理工具&#xff0c;就像找到靠譜的 “銷售小助手…

008房屋租賃系統技術揭秘:構建智能租賃服務生態

房屋租賃系統技術揭秘&#xff1a;構建智能租賃服務生態 在房地產租賃市場日益活躍的當下&#xff0c;房屋租賃系統成為連接房東與租客的重要數字化橋梁。該系統集成用戶管理、房屋信息等多個核心模塊&#xff0c;面向管理員、房東和用戶三類角色&#xff0c;通過前臺展示與后…

SpringBoot 系列之集成 RabbitMQ 實現高效流量控制

系列博客專欄&#xff1a; JVM系列博客專欄SpringBoot系列博客 Spring Boot 2.2.1 集成 RabbitMQ 實現高效流量控制 在分布式系統中&#xff0c;消息隊列是實現異步通信、解耦服務的重要組件。RabbitMQ 作為一款成熟的開源消息隊列&#xff0c;廣泛應用于各類項目中。本文將…

新視訊影視官網入口,影視動漫在線播放網站

新視訊影視是一個免費為廣大追劇迷提供在線播放服務的影視平臺&#xff0c;深受眾多影視愛好者的喜愛。它涵蓋了大量免費的VIP電視劇資源、最新上映的大片、好看的綜藝節目以及動漫視頻&#xff0c;是一個播放速度快、資源多的免費影視網站。用戶無需注冊或登錄&#xff0c;即可…

【使用】【經驗】docker 清理未使用的鏡像的命令

docker images prune在 Docker 中清理未使用的鏡像&#xff08;包括懸空鏡像和完全未被引用的鏡像&#xff09;&#xff0c;可以使用以下命令&#xff1a; 1. ?刪除所有懸空鏡像?&#xff08;推薦常用&#xff09; docker image prune?懸空鏡像 (dangling images)?? 是指…

OpenCV CUDA模塊圖像處理------圖像融合函數blendLinear()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數執行 線性融合&#xff08;加權平均&#xff09; 兩個圖像 img1 和 img2&#xff0c;使用對應的權重圖 weights1 和 weights2。 融合公式…

【Typst】6.布局函數

概述 上節我們介紹了文檔結構元素的函數&#xff0c;本節介紹一些控制布局使用的函數&#xff0c;掌握他們之后你可以更進一步的控制頁面元素的布局。 系列目錄 1.Typst概述2.Typst標記語法和基礎樣式3.Typst腳本語法4.導入、包含和讀取5.文檔結構元素與函數6.布局函數 對齊…

【音視頻】FFmpeg 編碼H265

一、概述 實現了讀入本地yuv文件&#xff0c;通過libx265編碼為H265格式&#xff0c;并存儲到本地文件中 二、實現流程 準備文件 在build路徑下準備yuv文件 在項目中添加文件參數&#xff0c;輸出為h265文件&#xff0c;使用libx265編碼 初始化解碼器 通過傳進來的libx265…

ECreator低代碼平臺-文件管理器的使用說明

Ecreator是中山華拓信息技術公司旗下的一款低代碼平臺&#xff0c;主要功能包含&#xff1a;文件管理器&#xff0c;表單數據管理器&#xff0c;儀表盤設計界面&#xff0c;內容頁面自定義等功能&#xff0c;可以用于快速低成本的構建網站和企業內部應用。 下面介紹一下文件管…

高考加油!UI界面生成器!

這個高考助力標語生成器具有以下特點&#xff1a; 視覺設計&#xff1a;采用了藍色為主色調&#xff0c;搭配漸變背景和圓形裝飾元素&#xff0c;營造出寧靜而充滿希望的氛圍&#xff0c;非常適合高考主題。 標語生成&#xff1a;內置了超過 100 條精心挑選的高考加油標語&a…

阿姆達爾定律的演進:古斯塔夫森定律

前言 在上一篇文章《使用阿姆達爾定律來提升效率》中提到的阿姆達爾定律前提是假設問題的規模保持不變&#xff0c;并且給定一臺速度更快的機器&#xff0c;目標是更快地解決問題。然而&#xff0c;在大多數情況下&#xff0c;這并不完全正確。當有一臺更快的機器時&#xff0…

【RabbitMQ】- Channel和Delivery Tag機制

在 RabbitMQ 的消費者代碼中&#xff0c;Channel 和 tag 參數的存在是為了實現消息確認機制&#xff08;Acknowledgment&#xff09;和精細化的消息控制。 Channel 參數 作用 Channel 是 AMQP 協議的核心操作接口&#xff0c;通過它可以直接與 RabbitMQ 交互&#xff1a; 手…

核心機制:流量控制

搭配滑動窗口使用的 窗口大小 窗口越大,傳輸速度就越快,但是也不能無限大,太大了,對于可靠性會有影響 比如發生方以非常快的速度,發送,接收方的處理速度跟不上,也就會導致有效數據被接受方丟棄(又得重傳) 流量控制,就是根據接收方的處理能力(如何衡量?),干預到發送方的發送…

深度強化學習賦能城市消防優化,中科院團隊提出DRL新方法破解設施配置難題

在城市建設與發展中&#xff0c;地理空間優化至關重要。從工業園區選址&#xff0c;到公共服務設施布局&#xff0c;它都發揮著關鍵作用。但傳統求解方法存在諸多局限&#xff0c;如今&#xff0c;深度學習技術為其帶來了新的轉機。 近日&#xff0c;在中國地理學會地理模型與…