| 呼叫方式 | 執行緒數 | 執行順序 | 適用場景 |
|---|---|---|---|
thread.start() | 2+(主執行緒 + 新執行緒) | 並行(新執行緒進入就緒狀態,CPU 排程決定何時執行 run()) | 所有需多執行緒場景 |
thread.run() | 1(僅主執行緒) | 循序(主執行緒直接執行 run() 內容,阻塞至結束) | 測試、除錯、非多執行緒邏輯 |
new Thread() → start() → JVM 分配堆疊、PC 計數器 → 就緒隊列 → CPU 排程 → run() 執行
↓
主執行緒繼續向下執行(並行)
new Thread() → run() → 當作普通方法呼叫 → 主執行緒阻塞執行完畢 → 繼續
public class ThreadDemo {
public static void main(String[] args) {
Thread t = new Thread(() -> {
for (int i = 0; i < 3; i++) {
System.out.println("子執行緒: " + i);
sleep(100);
}
});
System.out.println("=== 呼叫 start() ===");
t.start(); // 啟動新執行緒
System.out.println("主執行緒繼續執行,不等待子執行緒");
// 重新建立 Thread 物件(Thread 不可重複 start)
Thread t2 = new Thread(() -> {
for (int i = 0; i < 3; i++) {
System.out.println("子執行緒: " + i);
sleep(100);
}
});
System.out.println("\n=== 呼叫 run() ===");
t2.run(); // 普通方法呼叫
System.out.println("主執行緒在 run() 結束後才印出這行");
}
static void sleep(long ms) { try { Thread.sleep(ms); } catch (InterruptedException ignored) {} }
}
=== 呼叫 start() ===
主執行緒繼續執行,不等待子執行緒
子執行緒: 0
子執行緒: 1
子執行緒: 2
=== 呼叫 run() ===
子執行緒: 0
子執行緒: 1
子執行緒: 2
主執行緒在 run() 結束後才印出這行
new Thread(runnable).run() 以為啟動執行緒 → 實為同步呼叫。start() → 拋 IllegalThreadStateException。ExecutorService 或重新 new Thread()。// 1. 執行緒池(生產環境標準)
ExecutorService pool = Executors.newFixedThreadPool(4);
pool.submit(() -> { /* 任務 */ });
// 2. Virtual Thread (Java 21+)
Thread.startVirtualThread(() -> { /* 輕量任務 */ });
// 3. CompletableFuture 非同步流程
CompletableFuture.runAsync(() -> { /* 任務 */ });
start() 是啟動執行緒的唯一正確入口,它讓 JVM 建立新執行緒上下文並排程執行 run()。直接呼叫 run() 只是單執行緒同步執行,完全失去多執行緒優勢。現代開發請優先使用執行緒池與高階並發 API。