DOS 時代一次只能跑一個程式;現代 OS 支援多進程並發(QQ、Word、瀏覽器同時開)。Java 在單一進程內部進一步引入線程,實現更細粒度的並發:
線程被稱為「輕量級進程」,建立/切換開銷遠小於進程。
| 優勢 | 說明 | 典型場景 |
|---|---|---|
| 提升響應速度 | 耗時任務(網路、IO、計算)放背景線程,UI 線程保持流暢 | Swing/JavaFX 應用、Android ANR 避免 |
| 充分利用多核 CPU | 多線程並行計算,榨乾硬體效能 | 影像處理、科學計算、高併發伺服器 |
⚠️ 線程過多會導致頻繁上下文切換,反而降低效能。實際專案需配合線程池控制併發度。
┌─────────┐
│ NEW │ new Thread()
└────┬────┘
│ start()
▼
┌───────────────┐
│ RUNNABLE │ ◄────────────────┐
│ (就緒/運行) │ │
└───────┬───────┘ │
│ │
┌──────┴──────┐ │
│ │ │
sleep() wait() / join() │
│ │ │
▼ ▼ │
┌─────────┐ ┌──────────┐ │
│ TIMED_ │ │ BLOCKED │ │
│ WAITING │ │ (鎖等待) │ │
└────┬────┘ └────┬─────┘ │
│ │ │
│ timeout/ │ notify()/ │
│ interrupt │ lock released │
▼ ▼ │
┌───────────────────────────────┐
│ TERMINATED │ run() 結束 / 異常退出
└───────────────────────────────┘
start()。synchronized 區塊被阻擋)。notify()/interrupt() 喚醒。sleep()/wait(timeout)/join(timeout)。| 方法 | 作用 | 注意事項 |
|---|---|---|
start() | 啟動線程 | 只能呼叫一次 |
sleep(ms) | 當前線程讓出 CPU 休眠 | 靜態方法,不釋放鎖 |
yield() | 提示排程器讓出 CPU | 不保證生效,僅作提示 |
join() | 等待該線程終止 | 常用於主線程等待子線程 |
interrupt() | 發送中斷信號 | 不強制停止,需配合檢查 |
isInterrupted() | 檢查中斷狀態 | 不清除標誌 |
Thread.interrupted() | 檢查並清除中斷狀態 | 靜態方法 |
// 主線程
main() {
Thread t = new MyThread(); // NEW
t.start(); // → RUNNABLE (新線程)
// 主線程繼續...
}
// 新線程
run() {
// RUNNABLE → RUNNING → ... → TERMINATED
}
掌握進程/線程區別、多線程優勢與代價、六大狀態流轉、核心控制 API,是寫出正確、高效併發程式的基石。下一章將實戰演示三種線程實現方式。