什麼是多執行緒?
多執行緒讓程式同時執行多個任務,提升 CPU 利用率與回應性。Java 內建支援,是語言核心特色之一。
單執行緒 vs 多執行緒
- 單執行緒:循序執行,阻塞操作(I/O、睡眠)導致整個程式停滯。
- 多執行緒:任務分派給不同執行緒並行,阻塞不影響其他任務。
兩種實作執行緒的方式
方式一:繼承 Thread 類別
public class PrintThread extends Thread {
private int count = 0;
@Override
public void run() {
for (;;) {
System.out.println(++count + ": Thread");
try { Thread.sleep(100); } catch (InterruptedException ignored) {}
}
}
public static void main(String[] args) {
PrintThread t = new PrintThread();
t.start(); // 啟動新執行緒,呼叫 run()
// 主執行緒繼續執行
for (;;) {
System.out.println("Main");
try { Thread.sleep(100); } catch (InterruptedException ignored) {}
}
}
}
方式二:實作 Runnable 介面(推薦)
public class PrintRunnable implements Runnable {
@Override
public void run() {
for (;;) System.out.println("T");
}
public static void main(String[] args) {
Thread t = new Thread(new PrintRunnable());
t.start();
for (;;) System.out.println("M");
}
}
核心差異比較
| 特性 | extends Thread | implements Runnable |
| 繼承限制 | 單一繼承,無法繼承其他類別 | 無限制,可繼承其他類別 |
| 職責分離 | 執行緒控制與任務邏輯耦合 | 任務邏輯與執行緒控制分離 |
| 資源共享 | 較難共享同一任務實例 | 易共享:new Thread(runnable) 多次 |
| 執行緒池相容 | 不直接支援 | 完美支援 ExecutorService |
| Lambda 友善 | 否 | 是:() -> { ... } |
執行緒生命週期
NEW → RUNNABLE → RUNNING → BLOCKED/WAITING/TIMED_WAITING → TERMINATED
start():從 NEW 轉 RUNNABLE,JVM 排程執行 run()。
- 直接呼叫 run():不會啟動新執行緒,只是在當前執行緒執行方法。
sleep():讓出 CPU,進入 TIMED_WAITING。
join():等待目標執行緒結束。
wait()/notify():Object 監視器協調(需在 synchronized 區塊)。
執行緒優先級
- 範圍:1 (
MIN_PRIORITY) ~ 10 (MAX_PRIORITY),預設 5 (NORM_PRIORITY)。
setPriority(int) / getPriority()。
- 注意:優先級只是提示,排程器不保證嚴格遵守。
執行緒群組
ThreadGroup group = new ThreadGroup("MyGroup");
Thread t1 = new Thread(group, task, "Worker-1");
Thread t2 = new Thread(group, task, "Worker-2");
group.list(); // 列印群組結構
常見管理方法(Thread 類別)
| 方法 | 說明 |
start() | 啟動執行緒 |
sleep(ms) | 靜態方法,讓當前執行緒睡眠 |
yield() | 讓出 CPU,重新排程 |
join() | 等待執行緒結束 |
interrupt() | 中斷執行緒(設定中斷旗標) |
isAlive() | 檢查是否存活 |
setDaemon(true) | 設為守護執行緒(JVM 結束不等待) |
最佳實務建議
- 優先用
Runnable + ExecutorService(執行緒池),避免手動管理 Thread。
- 任務邏輯與執行緒控制分離,便於測試與重用。
- 共享資料用
volatile、Atomic*、synchronized 或並發集合。
- 避免使用
stop()、suspend()、resume()(已淘汰,不安全)。
- 妥善處理
InterruptedException,保留中斷狀態:Thread.currentThread().interrupt()。