在 Java 程式設計中,實現多線程主要有兩種標準方式:繼承 Thread 類與實現 Runnable 接口。這兩種方式各有優劣,選擇哪一種取決於具體的應用場景和設計需求。值得注意的是,Thread 類本身也是通過實現 Runnable 接口來定義線程行為的。
Thread 類位於 java.lang 包中,是 Java 線程的基礎實現。通過繼承 Thread 類並重寫 run() 方法,可以快速建立自定義線程。
class TestThread extends Thread {
// 成員變量(建議設為私有)
// 構造函數(公共,無返回值)
@Override
public void run() {
// 線程執行體 - 此處編寫線程具體執行的業務邏輯
}
}
TestThread thread1 = new TestThread();
// 必須調用 start() 方法啟動線程,而非直接調用 run()
thread1.start();
關鍵點:調用 start() 會由 JVM 創建新線程並自動調用 run();直接調用 run() 只是普通方法調用,不會開啟新線程。
實現 Runnable 接口是更靈活的方式,因為 Java 不支持多重繼承,繼承 Thread 類會限制類的擴展性。Runnable 將線程任務與線程控制解耦,符合「組合優於繼承」的設計原則。
class TestThread implements Runnable {
// 成員變量
// 構造函數
@Override
public void run() {
// 線程執行體
}
}
TestThread thread2 = new TestThread();
// 將 Runnable 實例傳給 Thread 構造函數,可指定線程名稱
new Thread(thread2, "Threadone").start();
| 特性 | 繼承 Thread | 實現 Runnable |
|---|---|---|
| 繼承限制 | 無法繼承其他類 | 可繼承其他類,靈活性高 |
| 資源共享 | 較難實現 | 天然支持多線程共享同一任務實例 |
| 線程池適配 | 不直接支持 | 完美適配 ExecutorService 等線程池 |
| Lambda 表達式 | 不支持 | Java 8+ 可用 Lambda 簡化代碼 |
// 使用 Lambda 表達式
Runnable task = () -> {
System.out.println("執行線程任務: " + Thread.currentThread().getName());
};
new Thread(task, "LambdaThread").start();
// 或搭配線程池使用
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(task);
雖然繼承 Thread 類寫法簡單直觀,但在實際企業級開發中,強烈建議優先使用 Runnable 接口。它提供了更好的解耦性、擴展性,且能無縫整合現代 Java 並發框架(如線程池、CompletableFuture 等)。理解這兩種方式的底層原理與適用場景,是掌握 Java 多線程編程的基石。