首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Thread.run() 方法誤區:為什麼不能直接調用 run()?start() 與 run() 的本質區別

     編輯:程式設計綜合問答

核心結論

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。
  • 誤以為 Runnable.run() 會自動多線程:new Thread(runnable).run() 同理錯誤。
  • 重複調用 start():線程結束後再次 start() 拋 IllegalThreadStateException。

最佳實踐

  1. 永遠用 thread.start() 啟動線程。
  2. 業務邏輯放在 run() 或 Runnable.run() 中。
  3. 需等待線程結束用 thread.join();需返回結果用 Future/Callable 或 CompletableFuture。
  4. 線程池:ExecutorService.submit(runnable) 內部調用 Thread.start(),開發者無感知。

記住口訣:**run 是邏輯,start 是生命**;不調 start,線程不生。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved