run()。限制:單一繼承,無法繼承其他業務類別。run(),再透過 new Thread(runnable).start() 啟動。優勢:避開單一繼承限制,天然支援資源共享。start() 是 native 方法(JNI),會請求作業系統建立新執行緒並排程執行 run()。直接呼叫 run() 只是普通方法調用,不會開啟新執行緒。
class MyThread extends Thread {
private int ticket = 10;
public void run() {
for (int i = 0; i < 20; i++)
if (ticket > 0) System.out.println("賣票:" + ticket--);
}
}
public class ThreadTicket {
public static void main(String[] args) {
new MyThread().start();
new MyThread().start();
new MyThread().start(); // 三個實例,各有 10 張票
}
}
class MyThread implements Runnable {
private int ticket = 10;
public void run() {
for (int i = 0; i < 20; i++)
if (ticket > 0) System.out.println("賣票:" + ticket--);
}
}
public class RunnableTicket {
public static void main(String[] args) {
MyThread mt = new MyThread(); // 單一實例
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start(); // 三執行緒共享同一 ticket
}
}
| 維度 | 繼承 Thread | 實作 Runnable |
|---|---|---|
| 繼承限制 | 單一繼承,無法擴展其他類 | 可同時實作多介面、繼承業務類 |
| 資源共享 | 需額外機制(static/外部物件) | 天然共享同一 Runnable 實例的欄位 |
| 耦合度 | 執行緒邏輯與任務邏輯耦合 | 任務邏輯獨立,交由 Thread 執行 |
| Thread 關係 | 本身即 Thread 子類 | Thread 接受 Runnable 為目標 |
public class Thread extends Object implements Runnable { ... }
Thread 本身實作了 Runnable,Thread(Runnable target) 建構子將任務委派給目標物件。
interrupt()、設定優先權)時再考慮繼承 Thread。ExecutorService)提交 Runnable/Callable,進一步分離任務提交與執行緒管理。理解 Runnable 與 Thread 的關係與差異,掌握資源共享的實現方式,是編寫高併發、可維護 Java 多執行緒程式的基石。