new Thread() {
@Override public void run() {
super.run(); // 預設空實作
// 業務邏輯
}
}.start();
new Thread(new Runnable() {
@Override public void run() {
// 業務邏輯
}
}).start();
| 維度 | 繼承 Thread | 實作 Runnable |
|---|---|---|
| 繼承限制 | 單一繼承,無法繼承其他類 | 無限制,可繼承其他類 |
| 資源共享 | 每個 Thread 實例獨立,難以共享狀態 | 同一 Runnable 實例可傳給多 Thread,易共享數據 |
| 線程池相容 | 不支援 ExecutorService 提交 | 完美支援 execute(runnable) |
| 邏輯分離 | 執行緒控制與任務邏輯耦合 | 任務邏輯獨立,符合單一職責 |
原回答提到 start() 內部旗標導致二次調用異常,實際上 Thread.start() 多次調用會拋 IllegalThreadStateException,這與繼承方式無關,而是 Thread 生命週期規定。真正的問題在於設計靈活性。
new Thread(() -> { ... }).start();(Lambda 簡化 Runnable)。ExecutorService pool = Executors.newFixedThreadPool(n); pool.submit(() -> ...);。Thread.startVirtualThread(() -> ...);。結論:優先使用 Runnable + 執行緒池,避免手動管理 Thread 生命週期。