Java 提供兩種建立執行緒的主要途徑:繼承 Thread 類別與實作 Runnable 介面。兩者在語法、設計彈性、資源共享上有本質差異。
class MyThread extends Thread {
private String name;
public MyThread(String name) { this.name = name; }
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("執行緒:" + name + ", i=" + i);
}
}
}
// 啟動
MyThread mt1 = new MyThread("執行緒A");
MyThread mt2 = new MyThread("執行緒B");
mt1.start(); // 必須呼叫 start(),而非 run()
mt2.start();
關鍵點:start() 會請求 JVM 配置新執行緒並呼叫 run();直接呼叫 run() 只是單執行緒循序執行。Thread 內部透過 native 方法 start0() (JNI) 與作業系統互動。
class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) { this.name = name; }
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("執行緒:" + name + ", i=" + i);
}
}
}
// 啟動:將 Runnable 實例傳給 Thread 建構子
new Thread(new MyRunnable("執行緒A")).start();
new Thread(new MyRunnable("執行緒B")).start();
| 比較項目 | 繼承 Thread | 實作 Runnable |
|---|---|---|
| 繼承限制 | 單一繼承,無法繼承其他類別 | 可實作多個介面,彈性高 |
| 資源共享 | 每個 Thread 實例擁有獨立屬性,難以共享 | 同一 Runnable 實例可傳給多個 Thread,天然共享資料 |
| 耦合度 | 執行緒邏輯與控制耦合 | 職責分離:Runnable 負責任務,Thread 負責調度 |
| 適用場景 | 簡單、獨立的執行緒任務 | 複雜系統、需共享資料、線程池 |
class TicketThread extends Thread {
private int tickets = 10; // 每個實例各有 10 張
public void run() {
for (int i = 0; i < 20; i++) {
if (tickets > 0) System.out.println("賣票:" + tickets--);
}
}
}
new TicketThread().start(); // 各賣 10 張,總共 30 張
new TicketThread().start();
new TicketThread().start();
class TicketRunnable implements Runnable {
private int tickets = 10; // 單一實例共享
public void run() {
for (int i = 0; i < 20; i++) {
if (tickets > 0) System.out.println("賣票:" + tickets--);
}
}
}
TicketRunnable task = new TicketRunnable();
new Thread(task).start(); // 總共只賣 10 張
new Thread(task).start();
new Thread(task).start();
public class Thread extends Object implements Runnable { ... }
Thread 本身實作了 Runnable,這也是為什麼 Thread 建構子可以接受 Runnable 參數的原因。
ExecutorService) 與 Lambda 表達式 (Java 8+)。getId()、interrupt() 處理)。synchronized、Lock、AtomicInteger 等機制。Runnable 與 Thread 的選擇不只是語法偏好,更關乎系統架構的彈性與正確性。理解兩者在資源共享、繼承限制、耦合度上的差異,是撰寫高品質多執行緒程式的基石。