多線程是 Java 並發編程基石。本文系統講解線程創建兩大方式、後台線程、線程組管理,並深度解析線程生命周期六大狀態流轉與 JVM 調度原理。
class MyThread extends Thread {
@Override
public void run() {
// 線程執行邏輯
}
}
// 啟動
new MyThread().start(); // 必須調用 start(),而非 run()
run() 封裝執行代碼start() 請求 JVM 調度,絕不直接調用 run() (那會變成同步調用,失去並發性)
class MyTask implements Runnable {
@Override
public void run() { /* 邏輯 */ }
}
// 啟動
new Thread(new MyTask()).start();
// 或線程池執行
executor.submit(new MyTask());
setDaemon(true) 標記為守護線程 (需在 start() 前調用)ThreadGroup 樹狀結構組織線程/線程組new Thread(group, "name")interrupt()、setDaemon()、獲取活躍線程列表等
NEW (新建) → RUNNABLE (就緒/運行) → BLOCKED (阻塞)
↑ ↓
WAITING (等待) / TIMED_WAITING (超時等待)
↓
TERMINATED (終止)
| 狀態 | 觸發條件 | 流出條件 |
|---|---|---|
| NEW | new Thread() | 調用 start() |
| RUNNABLE | start() 後、鎖獲取後 | CPU 時間片輪轉、鎖競爭失敗、I/O 等待 |
| BLOCKED | 嘗試進入 synchronized 塊/方法失敗 | 獲得鎖 |
| WAITING | Object.wait()、Thread.join()、LockSupport.park() | notify()/notifyAll()、被中斷、join 目標結束 |
| TIMED_WAITING | sleep()、wait(timeout)、join(timeout)、parkNanos() | 超時到期、被喚醒/中斷 |
| TERMINATED | run() 正常返回、拋出未捕獲異常 | — |
thread.run() 直接調用 → 同步執行,無新線程stop()/suspend()/resume() 已棄用 → 導致數據不一致/死鎖interrupt() + isInterrupted() 協作式停止