Java 多線程的核心在於 Thread 類與 Runnable 接口的協作。Thread 代表線程本身(執行單元),而 Runnable 代表任務(執行內容)。這種設計體現了「職責分離」原則:線程管理生命周期,任務封裝業務邏輯。
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread.run()");
}
}
// 啟動:new MyThread().start();
優點:代碼簡潔,直接訪問 this 獲取線程屬性。
缺點:Java 單繼承限制,若已繼承其他類則無法使用。
public class MyTask implements Runnable {
@Override
public void run() {
System.out.println("MyTask.run()");
}
}
// 啟動:
MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();
優點:
// Thread.java 關鍵片段
public synchronized void start() {
// ... 線程狀態檢查 ...
start0(); // native 方法,請求操作系統創建新線程
}
public void run() {
if (target != null) {
target.run(); // 委託給 Runnable 任務
}
}
關鍵結論:
start() 是啟動新線程的唯一入口,底層調用 native 方法run() 只是普通方法調用,不會創建新線程,仍在當前線程執行Thread 默認 run() 為空實現,必須通過繼承或注入 Runnable 賦予業務邏輯關鍵規則:一個 Thread 實例只能 start() 一次。運行結束後不可重啟,必須創建新實例。這是因為底層操作系統線程結束後資源已釋放,Java 層面不支持重置線程狀態。
ExecutorService)使用,避免頻繁創建銷燬線程開銷Order-Process-Thread-1,便於排查問題Java 多線程的本質是 Thread(執行載體)與 Runnable(業務邏輯)的分離協作。掌握 start() 請求操作系統創建線程、run() 由線程執行任務的機制,理解單繼承限制下組合模式的優勢,是編寫高併發 Java 應用的基石。現代開發中,更應結合 Executor 框架、CompletableFuture 等高級抽象,而非裸露操作 Thread。