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

Java 多線程核心:Thread.start() 與 run() 差異深度解析

     編輯:Java 相關知識

Thread 類別提供兩個關鍵方法:start() 與 run()。兩者**極易混淆**,但語意截然不同,直接影響多線程程式的正確性與效能。

核心差異一覽表

方法作用執行緒可重複呼叫底層機制
start()啟動**新執行緒**,由 JVM 排程執行 run()新建執行緒否 (第二次拋 IllegalThreadStateException)JNI start0() → OS 執行緒建立
run()僅作為**普通方法**在**當前執行緒**同步執行當前執行緒 (main 等)是直接呼叫 target.run() 或空實作

程式碼驗證

public class StartVsRunDemo {
    static class MyThread extends Thread {
        @Override public void run() {
            for (int i = 0; i < 3; i++) {
                System.out.printf("%s: i=%d%n", Thread.currentThread().getName(), i);
            }
        }
    }

    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.setName("MyThread");

        System.out.println("--- 呼叫 t.run() (同步執行) ---");
        t.run(); // 主執行緒直接跑 run()

        System.out.println("--- 呼叫 t.start() (啟動新執行緒) ---");
        t.start(); // 新執行緒非同步跑 run()
        
        System.out.println("main 結束");
    }
}

執行結果 (順序可能交錯)

--- 呼叫 t.run() (同步執行) ---
main: i=0
main: i=1
main: i=2
--- 呼叫 t.start() (啟動新執行緒) ---
main 結束
MyThread: i=0
MyThread: i=1
MyThread: i=2

源碼層面解析 (JDK 17)

// Thread.java
public synchronized void start() {
    if (threadStatus != 0) throw new IllegalThreadStateException();
    group.add(this);
    boolean started = false;
    try {
        start0();          // native 方法,向 OS 申請新執行緒
        started = true;
    } finally {
        if (!started) group.threadStartFailed(this);
    }
}

private native void start0(); // JNI 進入點

public void run() {
    if (target != null) target.run(); // target 為 Runnable 實例
}

常見錯誤與最佳實務

  • ❌ 錯誤:new Thread(() -> {...}).run(); — 未啟動新執行緒,同步阻塞當前線程。
  • ✅ 正確:new Thread(() -> {...}).start(); — 真正並發執行。
  • ✅ Lambda 簡寫:new Thread(() -> System.out.println("running")).start();
  • 執行緒池替代:高併發場景請使用 ExecutorService,避免頻繁建立/銷毀 OS 執行緒開銷。

進階:實作 Runnable vs 繼承 Thread

優先實作 Runnable 或 Callable,再交給 Thread 或執行緒池執行,優點:

  1. 職責分離:任務邏輯與執行機制解耦。
  2. 可重複提交給不同執行器。
  3. 避免繼承 Thread 導致的單一繼承限制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved