在 Java 中,線程本質上也是一個 Object 類,所有線程實例均繼承自 java.lang.Thread 或其子類。創建並啟動一個線程的基本語法如下:
Thread thread = new Thread(); thread.start();
注意:若未為線程編寫具體的運行代碼,調用 start() 後線程會立即終止。要編寫線程執行的業務邏輯,主要有兩種途徑:繼承 Thread 類並重寫 run() 方法,或實現 Runnable 接口。
通過創建 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();
第二種方式是創建一個實現 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();
兩種方式各有優劣,但業界普遍推薦實現 Runnable 接口,主要原因包括:
Runnable 任務,任務排隊機制天然支持;繼承 Thread 的方式在線程池場景下較為複雜。Runnable 實例可被多個線程共享,便於實現資源共享場景(如賣票系統)。實際開發中常結合使用:Thread 子類負責線程管理,內部執行多個 Runnable 任務,這正是線程池的核心設計思想。
新手易犯錯誤: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();
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 和作業系統調度器決定。