首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Thread start() 與 run() 差異詳解:真正多執行緒 vs 普通方法呼叫

     編輯:Java 程式設計入門

核心結論

呼叫方式執行緒數執行順序適用場景
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。

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