Java 內置多線程支持,所有實現 Runnable 接口的類實例均可作為線程任務。本文系統講解線程創建的兩種標準方式、start() 與 run() 的本質區別、線程生命週期及常見誤區。
Thread 類實現了 Runnable,代表一個線程實例Thread.start() 實例方法start() 是 native 方法,會請求 JVM 創建新線程並異步執行 run()run() 只是普通方法調用,不會創建新線程start()
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread.run() 執行於線程:" + Thread.currentThread().getName());
}
}
// 啟動
new MyThread().start();
優點:代碼簡潔,直接訪問 this 即當前線程對象。
缺點:Java 單繼承限制,若已繼承其他類則無法使用。
public class MyTask implements Runnable {
@Override
public void run() {
System.out.println("MyTask.run() 執行於線程:" + Thread.currentThread().getName());
}
}
// 啟動
MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();
優點:
Runnable 實例可提交給多個線程(如線程池)new Thread(() -> System.out.println("Hi")).start();| 調用方式 | 線程創建 | 執行線程 | 是否異步 |
|---|---|---|---|
| thread.start() | 是 | 新線程 | 是 |
| thread.run() | 否 | 當前線程 | 否(同步阻塞) |
NEW → RUNNABLE → RUNNING → BLOCKED/WAITING/TIMED_WAITING → TERMINATED
new Thread() 創建,未調用 start()start() 後,等待 CPU 調度run()Object.wait()、Thread.join())sleep()、wait(timeout)、join(timeout))run() 正常返回或拋出未捕獲異常結束new Thread(new MyTask()).run() — 忘記 start(),主線程同步執行任務start() — 拋出 IllegalThreadStateExceptionExecutorService)管理線程生命週期,避免頻繁創建銷毀開銷Runnable 或 Callable,與執行策略解耦setDaemon(true))用於後台輔助任務,JVM 退出時不等待其結束
public class SafeTask implements Runnable {
private final String taskName;
public SafeTask(String taskName) { this.taskName = taskName; }
@Override
public void run() {
try {
System.out.println("[" + taskName + "] 開始執行");
// 業務邏輯...
Thread.sleep(1000);
System.out.println("[" + taskName + "] 正常結束");
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 保持中斷狀態
System.out.println("[" + taskName + "] 被中斷");
} catch (Exception e) {
System.err.println("[" + taskName + "] 異常:" + e.getMessage());
}
}
}
// 使用線程池執行
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(new SafeTask("Task-1"));
executor.submit(new SafeTask("Task-2"));
executor.shutdown();
掌握線程創建啟動本質,是編寫正確並發程序的起點。實際開發中強烈建議使用線程池與 Runnable/Callable 任務模式,而非手動管理 Thread 實例。