Java 語言層面內建了多線程機制,所有實作 Runnable 介面的類別皆可啟動新線程。新線程會執行該實例的 run() 方法,當 run() 執行結束,線程即停止。值得注意的是,一個線程執行結束後,該實例無法重複啟動,必須建立新實例再啟動新線程。
Thread 類別實作了 Runnable 介面,代表一個線程實例。啟動線程的唯一途徑是呼叫 Thread 的 start() 實例方法:
Thread t = new Thread();
t.start();
start() 是 native 方法,它會啟動新線程並執行 run()。Thread 預設的 run() 方法為空實作。直接呼叫 run() 並不會啟動新線程,僅同於呼叫普通 Java 方法。
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread.run()");
}
}
啟動方式:new MyThread().start();
public class MyThread extends OtherClass implements Runnable {
@Override
public void run() {
System.out.println("MyThread.run()");
}
}
啟動時需先實例化 Thread 並傳入 Runnable 實例:
MyThread myt = new MyThread();
Thread t = new Thread(myt);
t.start();
當建構 Thread 時傳入 Runnable target 參數,Thread 的 run() 會委派呼叫 target.run()。參考 JDK 原始碼:
public void run() {
if (target != null) {
target.run();
}
}
這種設計體現了組合優於繼承的靈活性,也是 Java 多線程編程的基石。