多線程是一種允許程式中多個指令流並發執行的機制,每個指令流稱為一個線程,彼此獨立運作。線程又被稱為「輕量級進程」,它與進程同樣擁有獨立的執行控制權,由作業系統負責調度。關鍵差異在於:線程沒有獨立的儲存空間,而是與所屬進程中的其他線程共享同一記憶體空間,這使得線程間通訊遠比進程間通訊簡單高效。
多線程的執行在邏輯上是「同時」進行的,無論是否在物理上真正同步。若系統只有一顆 CPU,真正的同步執行固然不可能,但 CPU 切換速度極快,使用者感知不到差異,因此開發者只需假設各線程同步執行即可。多線程與傳統單線程設計最大的區別在於:各線程控制流獨立,導致代碼執行順序不可預測,進而引發線程調度、同步等核心問題。
建立新線程的核心在於指定該線程要執行的代碼。Java 作為純物件導向語言,提供 java.lang.Thread 類別來支援多線程編程,其核心方法 run() 由 start() 呼叫,開發者只需覆寫 run() 即可注入自定義邏輯。
直接繼承 Thread 並覆寫 run() 方法,代碼直觀易懂。但缺點明顯:若類別已繼承其他類別(如 Applet),受限於 Java 單一繼承機制,無法再繼承 Thread。
public class MyThread extends Thread {
int count = 1, number;
public MyThread(int num) {
number = num;
System.out.println("建立線程 " + number);
}
public void run() {
while (true) {
System.out.println("線程 " + number + ":計數 " + count);
if (++count == 6) return;
}
}
public static void main(String args[]) {
for (int i = 0; i < 5; i++) new MyThread(i + 1).start();
}
}
為突破繼承限制,Java 提供 java.lang.Runnable 介面,僅定義單一 run() 方法。自定義類別實作此介面,再將實例傳給 Thread 建構子 Thread(Runnable target),即可達成相同效果且不佔用繼承名額。
public class MyThread implements Runnable {
int count = 1, number;
public MyThread(int num) {
number = num;
System.out.println("建立線程 " + number);
}
public void run() {
while (true) {
System.out.println("線程 " + number + ":計數 " + count);
if (++count == 6) return;
}
}
public static void main(String args[]) {
for (int i = 0; i < 5; i++) new Thread(new MyThread(i + 1)).start();
}
}
實務上推薦使用 Runnable 方式,彈性更高,也符合「組合優於繼承」的設計原則。