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

Java 多線程基礎與生命周期完全圖解:從創建到銷毀

     編輯:Java 綜合教學

Java 多線程基礎與生命周期完全圖解:從創建到銷毀

多線程是 Java 並發編程基石。本文系統講解線程創建兩大方式、後台線程、線程組管理,並深度解析線程生命周期六大狀態流轉與 JVM 調度原理。

一、線程創建兩大核心方式

1. 繼承 Thread 類


class MyThread extends Thread {
    @Override
    public void run() {
        // 線程執行邏輯
    }
}
// 啟動
new MyThread().start();  // 必須調用 start(),而非 run()
  • 覆寫 run() 封裝執行代碼
  • 調用 start() 請求 JVM 調度,絕不直接調用 run() (那會變成同步調用,失去並發性)

2. 實現 Runnable 接口 (推薦)


class MyTask implements Runnable {
    @Override
    public void run() { /* 邏輯 */ }
}
// 啟動
new Thread(new MyTask()).start();
// 或線程池執行
executor.submit(new MyTask());
  • 避免單繼承限制,靈活構建任務與執行分離
  • 便於提交至線程池、定時器等執行框架
  • Thread 本身也實現了 Runnable,本質統一

二、後台線程

  • setDaemon(true) 標記為守護線程 (需在 start() 前調用)
  • JVM 僅在所有用戶線程結束後退出,守護線程不阻塞 JVM 關閉
  • 典型用途:GC、JIT 編譯、監控掃描等服務型任務

三、線程組管理

  • ThreadGroup 樹狀結構組織線程/線程組
  • 創建線程時可指定組:new Thread(group, "name")
  • 批量操作:interrupt()、setDaemon()、獲取活躍線程列表等
  • 現代應用較少直接使用,線程池+命名模式替代

四、線程生命周期六大狀態流轉

NEW (新建) → RUNNABLE (就緒/運行) → BLOCKED (阻塞)
                    ↑    ↓
              WAITING (等待) / TIMED_WAITING (超時等待)
                    ↓
               TERMINATED (終止)
狀態觸發條件流出條件
NEWnew Thread()調用 start()
RUNNABLEstart() 後、鎖獲取後CPU 時間片輪轉、鎖競爭失敗、I/O 等待
BLOCKED嘗試進入 synchronized 塊/方法失敗獲得鎖
WAITINGObject.wait()、Thread.join()、LockSupport.park()notify()/notifyAll()、被中斷、join 目標結束
TIMED_WAITINGsleep()、wait(timeout)、join(timeout)、parkNanos()超時到期、被喚醒/中斷
TERMINATEDrun() 正常返回、拋出未捕獲異常—

五、JVM 線程調度核心規則

  1. 優先級:1-10 (MIN_PRIORITY=1, NORM_PRIORITY=5, MAX_PRIORITY=10),高優先級優先獲得 CPU
  2. 時間片輪轉:同優先級佔用 CPU 固定時間片後讓出
  3. 鎖競爭:同步塊/方法同一時刻僅一線程持有鎖,其他進入 BLOCKED
  4. 資源稀缺:信號量/連接池等有限資源耗盡導致線程 BLOCKED/WAITING

六、常見誤區避坑

  • ❌ thread.run() 直接調用 → 同步執行,無新線程
  • ❌ stop()/suspend()/resume() 已棄用 → 導致數據不一致/死鎖
  • ❌ 忽略中斷標誌 → 無法優雅停止線程
  • ✅ 使用 interrupt() + isInterrupted() 協作式停止
  • ✅ 線程池管理生命周期,避免頻繁創建銷毀開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved