首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 線程生命周期全景圖:從創建到銷毀的七個階段

     編輯:Java 相關知識

線程是 Java 併發編程的基本單位。理解其生命周期對編寫正確、高效的多線程程序至關重要。本文系統梳理線程從誕生到消亡的完整過程,涵蓋創建、運行、阻塞、等待、終止等關鍵狀態轉換。

線程創建:對象 ≠ 線程

  • 每個 Java 程序啟動時擁有主線程
  • 新線程通過 new Thread() 或繼承 Thread 創建
  • 關鍵區別:Thread 對象(JVM 堆上)≠ 操作系統線程(OS 調度實體)
  • start() 前:僅有 Thread 對象,無 OS 線程
  • start() 後:OS 創建線程,調用 run()
  • run() 結束:OS 線程銷毀,Thread 對象仍存活(可查詢狀態)
最佳實踐:絕不在構造器中調用 start()。構造器未完成時 this 逃逸,新線程可能訪問半初始化對象。應提供單獨的 start()/init() 方法。

線程終止:三種方式

  1. 正常結束:run() 方法執行完畢返回
  2. 異常終止:拋出未捕獲的 Exception 或 Error
  3. 強制終止(棄用):stop()、suspend()、resume() — 嚴禁使用,會破壞鎖一致性導致數據損壞

JVM 退出條件:所有非守護線程結束。守護線程(如 GC)不阻止 JVM 退出。

核心狀態轉換圖

NEW (新建) → start() → RUNNABLE (可運行) ↔ RUNNING (運行中)
    ↑                                    ↓
    │           sleep/yield/wait         │
    │           blocked on I/O           │
    │           synchronized             │
    └──────── TERMINATED (終止) ←────────┘

關鍵協作機制

join():等待線程終止

Thread t = new Thread(task);
t.start();
// 做其他事...
t.join(); // 阻塞當前線程,直到 t 終止
// t.join(5000) 超時版本

典型場景:主線程分解大任務 → 啟動多工作線程 → 循環 join() 等待所有完成 → 聚合結果。

sleep():定時釋放 CPU

Thread.sleep(1000); // 休眠 1 秒,不釋放鎖
Thread.sleep(0, 500000); // 納秒精度
  • 休眠結束 → 回到 RUNNABLE 隊列,非立即運行
  • 被 interrupt() 喚醒 → 拋出 InterruptedException

yield():禮讓同優先級線程

  • 暫停當前時間片,重新進入調度隊列
  • 高優先級線程 yield 時,低優先級通常不會獲得調度

守護線程:後台服務者

thread.setDaemon(true); // 必須在 start() 前調用
  • 典型用途:定時器、緩存清理、監控採集
  • JVM 僅等待非守護線程,守護線程隨 JVM 退出而強制終止

實戰示例:十線程分治求矩陣最大值

public class TenThreads {
    static class WorkerThread extends Thread {
        int max = Integer.MIN_VALUE;
        final int[] data;
        WorkerThread(int[] data) { this.data = data; }
        public void run() {
            for (int v : data) max = Math.max(max, v);
        }
        public int getMax() { return max; }
    }

    public static void main(String[] args) {
        WorkerThread[] threads = new WorkerThread[10];
        int[][] matrix = getBigMatrix();
        int globalMax = Integer.MIN_VALUE;

        for (int i = 0; i < 10; i++) {
            threads[i] = new WorkerThread(matrix[i]);
            threads[i].start();
        }

        try {
            for (WorkerThread t : threads) {
                t.join(); // 等待每個線程完成
                globalMax = Math.max(globalMax, t.getMax());
            }
        } catch (InterruptedException e) { /* 處理中斷 */ }

        System.out.println("Maximum value: " + globalMax);
    }
}

調度不確定性警示

多線程交替執行順序不可預測。示例:


// 兩線程各打印兩行
Thread1: A → B
Thread2: 1 → 2
// 可能輸出 6 種順序之一,永不假設固定順序!

鐵律:共享可變數據必須同步(synchronized/Lock/volatile/原子類)。

總結:生命周期關鍵點速查表

階段觸發條件關鍵方法注意事項
NEWnew Thread()構造器未關聯 OS 線程
RUNNABLEstart()start()就緒態,等待 CPU 調度
RUNNING獲得 CPUrun() 執行真正執行狀態
BLOCKED等待鎖synchronized不佔用 CPU
WAITING無限等待wait()/join()需 notify/終止喚醒
TIMED_WAITING限時等待sleep/wait/join(timeout)超時自動喚醒
TERMINATEDrun 結束/異常—線程死亡,不可重啟
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved