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

Java 多線程創建完整指南:Thread 繼承與 Runnable 實現詳解

     編輯:Java 綜合教學

Java 多線程創建的兩種核心方式

在 Java 中,線程本質上也是一個 Object 類,所有線程實例均繼承自 java.lang.Thread 或其子類。創建並啟動一個線程的基本語法如下:

Thread thread = new Thread();
thread.start();

注意:若未為線程編寫具體的運行代碼,調用 start() 後線程會立即終止。要編寫線程執行的業務邏輯,主要有兩種途徑:繼承 Thread 類並重寫 run() 方法,或實現 Runnable 接口。

方式一:繼承 Thread 類並重寫 run() 方法

通過創建 Thread 的子類並重寫 run() 方法,該方法會在調用 start() 後被異步執行。示例代碼如下:

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("MyThread running");
    }
}

MyThread myThread = new MyThread();
myThread.start(); // 注意:此處原文有拼寫錯誤 myTread,已修正

關鍵特性: start() 方法會立即返回,不會等待 run() 執行完畢。這就像 run() 在另一個 CPU 核心上並行執行一樣。

也可以使用匿名內部類簡化代碼:

Thread thread = new Thread() {
    @Override
    public void run() {
        System.out.println("Thread Running");
    }
};
thread.start();

方式二:實現 Runnable 接口

第二種方式是創建一個實現 java.lang.Runnable 接口的類,然後將其實例傳遞給 Thread 構造函數:

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("MyRunnable running");
    }
}

Thread thread = new Thread(new MyRunnable());
thread.start();

同樣支持匿名內部類寫法:

Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Runnable running");
    }
};
Thread thread = new Thread(myRunnable);
thread.start();

核心對比:繼承 Thread vs 實現 Runnable

兩種方式各有優劣,但業界普遍推薦實現 Runnable 接口,主要原因包括:

  • 線程池友好: 線程池可高效管理 Runnable 任務,任務排隊機制天然支持;繼承 Thread 的方式在線程池場景下較為複雜。
  • 解耦合: 任務邏輯與線程控制分離,符合「組合優於繼承」原則。
  • 靈活性: 同一 Runnable 實例可被多個線程共享,便於實現資源共享場景(如賣票系統)。

實際開發中常結合使用:Thread 子類負責線程管理,內部執行多個 Runnable 任務,這正是線程池的核心設計思想。

常見錯誤:直接調用 run() 而非 start()

新手易犯錯誤:new Thread(new MyRunnable()).run();

雖然 run() 執行了,但它運行在當前線程中(即主線程),而非新創建的線程。必須調用 start() 才能啟動新線程並由 JVM 安排調度。

線程命名與獲取當前線程

創建線程時可指定名稱,便於調試與日誌追蹤:

Thread thread = new Thread(runnable, "Worker-Thread-1");
thread.start();
System.out.println(thread.getName()); // 輸出: Worker-Thread-1

在 Runnable 實現類中獲取當前線程名稱:

String threadName = Thread.currentThread().getName();

完整示例:10 個並發線程演示

public class ThreadExample {
    public static void main(String[] args) {
        System.out.println("主線程: " + Thread.currentThread().getName());
        for (int i = 0; i < 10; i++) {
            new Thread("" + i) {
                @Override
                public void run() {
                    System.out.println("Thread: " + getName() + " running");
                }
            }.start();
        }
    }
}

重要觀察: 雖然啟動順序是 0~9,但輸出順序是不可預測的。這證明線程是並行執行而非順序執行,執行順序由 JVM 和作業系統調度器決定。

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