首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 線程創建兩大方式深度對比:繼承 Thread vs 實現 Runnable 的選型指南

     編輯:Java 綜合教學

核心結論先行

實現 Runnable 接口優於繼承 Thread 類 — 解耦任務邏輯與線程控制,支持多重繼承、線程池提交、Lambda 表達式。

方式一:繼承 Thread 類

class CounterThread extends Thread {
    private final Counter counter;
    private final int loops;
    public CounterThread(String name, Counter counter, int loops) {
        super(name);                 // 設置線程名
        this.counter = counter;
        this.loops = loops;
    }
    @Override public void run() {    // 線程執行體
        for (int i = 0; i < loops; i++) {
            counter.increment();
        }
    }
}

// 使用
Counter counter = new Counter();
Thread t1 = new CounterThread("T1", counter, 1000);
Thread t2 = new CounterThread("T2", counter, 1000);
t1.start(); t2.start();

缺點

  • 單繼承限制: 已繼承 Thread,無法繼承業務基類。
  • 任務與線程耦合: 邏輯綁定在線程子類中,難以復用、難以提交給線程池。
  • 無返回值: run() 為 void,需靠共享對象傳結果。

方式二:實現 Runnable 接口 (推薦)

class CounterTask implements Runnable {
    private final Counter counter;
    private final int loops;
    public CounterTask(Counter counter, int loops) {
        this.counter = counter;
        this.loops = loops;
    }
    @Override public void run() {
        for (int i = 0; i < loops; i++) counter.increment();
    }
}

// 使用:靈活綁定線程或線程池
Counter counter = new Counter();
Runnable task = new CounterTask(counter, 1000);
new Thread(task, "T1").start();
new Thread(task, "T2").start();           // 同一任務實例可被多線程執行 (需線程安全)
// 或提交線程池
ExecutorService pool = Executors.newFixedThreadPool(2);
pool.submit(task);
pool.shutdown();

優勢

  • 解耦: 任務邏輯與線程管理分離。
  • 復用: 同一 Runnable 可提交給多線程/線程池/定時器/CompletableFuture。
  • 支持 Lambda (Java 8+): new Thread(() -> { ... })
  • 可獲取返回值: 配合 Callable + Future / CompletableFuture。

對比總結表

維度繼承 Thread實現 Runnable
繼承限制單繼承,不可再繼承其他類無限制,可繼承業務基類
任務復用困難,邏輯綁定線程實例極易,任務對象可多次提交
線程池兼容不支持 (Thread 不實現 Runnable 接口)原生支持 ExecutorService.submit(Runnable)
返回值獲取無 (run 為 void)可配合 Callable/Future
Lambda 支持無完美支持
訪問 this直接訪問線程對象方法需 Thread.currentThread()
適用場景極簡原型、教學演示、需繼承 Thread 方法所有生產代碼、線程池、異步任務

進階:Callable + Future 獲取返回值

// 方式 1:構造器指定
new Thread(task, "Order-Processor-1").start();

// 方式 2:線程工廠統一命名 (生產推薦)
ThreadFactory factory = new ThreadFactoryBuilder()
    .setNameFormat("Order-Processor-%d")
    .setDaemon(true)
    .build();
ExecutorService pool = Executors.newFixedThreadPool(4, factory);

總結

Java 線程創建的本質是 任務 與 執行載體 的分離。Runnable/Callable 定義「做什麼」,Thread/ExecutorService 決定「怎麼跑」。始終優先實現 Runnable,配合線程池管理線程生命周期,是編寫高併發、可維護 Java 程序的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved