run() 只是**普通實例方法**,直接調用 thread.run() 會在**當前線程同步執行**,**不會啟動新線程**,達不到異步併發效果。
唯一正確啟動線程的方式是調用 start(),它會請求 JVM 創建新的系統線程,並在新線程中調用 run()。
調用 thread.run() 調用 thread.start()
┌─────────────────┐ ┌─────────────────┐
│ 主線程 │ │ 主線程 │
│ ├─ thread.run()│ │ ├─ thread.start()│──▶ 請求JVM創建新線程
│ │ 執行任務代碼 │ │ │ 立即返回 │
│ │ (阻塞主線程) │ │ └─ 繼續執行 │
│ └─ 返回 │ │ │
└─────────────────┘ │ 新線程 │
│ ├─ run() │
│ │ 執行任務代碼 │ (並行)
│ └─ 結束 │
└─────────────────┘
// Thread.java 片段
public void start() {
if (threadStatus != 0) throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0(); // native 方法,請求OS創建線程
started = true;
} finally { ... }
}
private native void start0(); // JVM 實現,最終調用 pthread_create / CreateThread
public void run() {
if (target != null) target.run(); // 只是調用 Runnable.run()
}
new MyThread().run() → 測試通過但生產環境併發 Bug。new Thread(runnable).run() 同理錯誤。start() 拋 IllegalThreadStateException。thread.start() 啟動線程。run() 或 Runnable.run() 中。thread.join();需返回結果用 Future/Callable 或 CompletableFuture。ExecutorService.submit(runnable) 內部調用 Thread.start(),開發者無感知。記住口訣:**run 是邏輯,start 是生命**;不調 start,線程不生。