Java 提供兩種基礎方式創建執行緒:**繼承 Thread 類**與**實現 Runnable 介面**。本文深度剖析兩者原理差異、優劣勢、源碼機制,並延伸至現代並發框架的最佳實踐。
public class AntThread extends Thread {
private final String name;
public AntThread(String name) { this.name = name; }
@Override
public void run() {
while (true) {
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(name + " 螞蟻正在下載......");
}
}
}
// 啟動
public static void main(String[] args) {
new AntThread("1號").start();
new AntThread("2號").start();
}
Thread 本身實現了 Runnable,run() 為空實現。start() (native 方法) → 分配 OS 執行緒 → 調用 run()。run() **不會啟動新執行緒**,僅在主執行緒同步執行。Thread 子類實例 = 一個執行緒,**無法復用任務邏輯**。public class Task implements Runnable {
@Override
public void run() {
System.out.println("任務執行: " + Thread.currentThread().getName());
}
}
// 啟動:包裝進 Thread
public static void main(String[] args) {
Task task = new Task();
new Thread(task, "Worker-1").start();
new Thread(task, "Worker-2").start(); // 同一任務實例可被多執行緒共享
}
// Thread.java 核心片段
private Runnable target; // 目標任務
public Thread(Runnable target) {
this.target = target;
}
@Override
public void run() {
if (target != null) {
target.run(); // 委派給 Runnable
}
}
Runnable 可提交給多個執行緒、執行緒池、CompletableFuture 等。Runnable。new Thread(() -> System.out.println("Hi")).start();Runnable 實例的字段,天然共享狀態。| 維度 | 繼承 Thread | 實現 Runnable |
|---|---|---|
| 繼承限制 | 佔用單繼承名額 | 無限制,可繼承其他類 |
| 任務復用 | 不可復用 (1 實例 = 1 執行緒) | 可被多執行緒/池復用 |
| 共享狀態 | 需額外傳遞共享物件 | 天然共享 this 字段 |
| Lambda 支援 | 無 (需匿名內部類) | 完美支援 |
| 適用場景 | 簡單獨立任務、教學演示 | 所有生產級開發、並發框架基石 |
Callabletask = () -> { Thread.sleep(1000); return 42; }; FutureTask futureTask = new FutureTask<>(task); new Thread(futureTask).start(); Integer result = futureTask.get(); // 阻塞獲取結果 System.out.println("結果: " + result);
生產環境禁用 new Thread() 直接創建執行緒,原因:
ExecutorService executor = Executors.newFixedThreadPool(4); // 或自定義 ThreadPoolExecutor
executor.submit(() -> System.out.println("池中執行"));
executor.shutdown();
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + " World")
.thenAccept(System.out::println)
.join();
Thread 是執行緒控制對象,Runnable 是任務單元,**任務與執行緒分離**是核心設計模式。ThreadPoolExecutor 精細控制核心/最大/隊列/拒絕策略。Thread 行為 (如自定義 ThreadLocal 繼承鏈)。