並發 vs 並行:核心概念辨析
| 維度 | 並發 | 並行 |
| 定義 | 同一時間段內處理多個任務,單核透過時間片切換 | 同一時刻物理上同時執行多個任務,需多核心 |
| 本質 | 邏輯上的同時發生 | 物理上的同時發生 |
| 目的 | 提高單核 CPU 利用率 | 提高多核吞吐量 |
| 類比 | 單廚師輪流做多道菜 | 多廚師同時做菜 |
Java 多執行緒模型優勢
- Java 原生支援多執行緒,語言層面提供
Thread、Runnable、同步機制
- Servlet 容器天生多執行緒(每請求一執行緒)
- Swing/SWT 事件分發執行緒(EDT)保證 UI 操作執行緒安全
- 掌握並發是高效開發分散式系統、Web 應用、高效能服務的前提
進程與執行緒深度對比
進程特徵
- 獨立地址空間,擁有獨立 PCB(進程控制塊)
- 進程間通訊(IPC)複雜:管道、Socket、共享記憶體、訊號
- 建立/切換開銷大(需切換頁表、刷新 TLB、保存/恢復寄存器)
- 穩定性高:單一進程崩潰不影響其他進程
執行緒特徵
- 共享進程地址空間、堆記憶體、檔案描述符
- 擁有獨立棧、程式計數器、區域變數
- 建立/切換開銷小(只需保存/恢復棧指針、寄存器)
- 通訊便捷:直接讀寫共享記憶體(需同步機制保護)
- 風險:單一執行緒錯誤可能導致整個進程崩潰
Java 執行緒建立與啟動完整指南
方式一:繼承 Thread 類別
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("執行緒運行: " + Thread.currentThread().getName());
}
}
// 使用
MyThread thread = new MyThread();
thread.start(); // 必須呼叫 start(),而非 run()
方式二:實現 Runnable 介面(推薦)
public class Task implements Runnable {
private final int taskId;
public Task(int id) { this.taskId = id; }
@Override
public void run() {
System.out.println("任務 " + taskId + " 執行於 " + Thread.currentThread().getName());
}
}
// 使用
Thread thread = new Thread(new Task(1));
thread.start();
Runnable vs Thread 設計哲學
- Runnable = 任務:封裝業務邏輯,可被多種執行器執行(Thread、執行緒池、CompletableFuture)
- Thread = 執行器:負責排程、生命週期管理、上下文切換
- 分離任務與執行策略,符合單一職責原則,支援靈活的執行緒池複用
執行緒生命週期與狀態轉換
NEW → RUNNABLE → RUNNING → BLOCKED/WAITING/TIMED_WAITING → TERMINATED
- NEW:建立 Thread 物件,未呼叫 start()
- RUNNABLE:呼叫 start() 後,等待 CPU 排程
- RUNNING:獲得 CPU 時間片,正在執行
- BLOCKED:等待監視器鎖(synchronized)
- WAITING:無限期等待(wait()、join())
- TIMED_WAITING:限時等待(sleep()、wait(timeout))
- TERMINATED:run() 正常結束或拋出未捕獲異常
常見誤區與最佳實踐
| 誤區 | 正確做法 |
| 直接呼叫 run() 方法 | 必須呼叫 start() 啟動新執行緒 |
| 使用 stop()/suspend()/resume() | 已棄用,使用 volatile 標誌位或 interrupt() 協作式終止 |
| 忽略異常處理導致執行緒靜默死亡 | 在 run() 中捕獲異常,記錄日誌,必要時重啟任務 |
| 過度建立執行緒導致 OOM | 使用執行緒池控制併發數量 |
Thread.yield() 與 線程調度
yield():提示調度器當前執行緒願意讓出 CPU,但不保證立即切換
- Java 執行緒調度為搶佔式優先級調度:高優先級執行緒獲得更多 CPU 時間
- 優先級範圍 1-10(MIN_PRIORITY=1, NORM_PRIORITY=5, MAX_PRIORITY=10)
- 優先級僅是提示,不保證執行順序,跨平台行為可能不同
總結
理解進程與執行緒的區別、掌握 Java 多執行緒建立方式、生命週期管理、同步機制,是並發程式設計的基石。後續將深入探討執行緒同步、鎖機制、並發容器、執行緒池、JUC 組件等進階主題。