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

Java 多線程編程核心:Thread 繼承與 Runnable 實現雙模式深度解析

     編輯:Java 相關知識

多線程讓程式擁有多條獨立執行路徑,邏輯上「同時」運行。Java 提供 java.lang.Thread 類封裝線程控制,核心在於如何指定線程執行代碼——兩種標準模式各有優勢。

模式一:繼承 Thread 類,重寫 run()

public class MyThread extends Thread {
    private final int id;
    public MyThread(int id) { this.id = id; }

    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("Thread-" + id + ": count=" + i);
        }
    }

    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++)
            new MyThread(i).start();  // 必須調用 start(),而非 run()
    }
}
  • 優點:直觀、繼承體系清晰、可直接使用 this 訪問線程方法(getName(), sleep() 等)。
  • 缺點:單繼承限制——若類已繼承 Applet、HttpServlet 等框架基類,無法再繼承 Thread。

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

public class MyTask implements Runnable {
    private final int id;
    public MyTask(int id) { this.id = id; }

    @Override
    public void run() {
        for (int i = 1; i <= 5; i++)
            System.out.println("Task-" + id + ": count=" + i);
    }

    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++)
            new Thread(new MyTask(i)).start();  // 將 Runnable 傳給 Thread 構造器
    }
}
  • 優點:解耦任務邏輯與線程控制,類可自由繼承其他基類;同一 Runnable 實例可提交給線程池、ExecutorService、CompletableFuture 等高級 API。
  • 缺點:在 run() 中需 Thread.currentThread() 獲取線程上下文,稍顯間接。

核心區別總結

維度extends Threadimplements Runnable
繼承靈活性佔用唯一繼承名額無影響
任務復用難(綁定線程實例)易(分離任務邏輯)
線程池適配不直接支援原生支援
訪問線程方法直接 this.xxx()Thread.currentThread().xxx()

進階:線程生命週期與狀態轉換

NEW → RUNNABLE → (RUNNING) → BLOCKED/WAITING/TIMED_WAITING → TERMINATED

  • start():請求 JVM 配置線程,異步調用 run()。
  • sleep()/join():靜態方法操作當前線程,不釋放鎖。
  • wait()/notify():Object 實例方法,需在 synchronized 塊中調用,釋放鎖進入等待集。
  • interrupt():設置中斷標誌,配合 InterruptedException 實現協作式取消。

工程建議

  1. 默認使用 Runnable + 線程池 (Executors),手動 new Thread 僅用於簡單測試/原型。
  2. 共享數據必須同步:synchronized、ReentrantLock、volatile、Atomic*、Concurrent* 集合。
  3. 線程命名:thread.setName("Order-Processor-" + id),日誌排查效率倍增。
  4. 異常處理:Thread.setDefaultUncaughtExceptionHandler() 統一捕獲非預期崩潰。

多線程是利用多核 CPU、實現高併發的基石。從 Runnable 開始,逐步掌握同步工具、線程池、非阻塞算法,構建健壯的並發系統。

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