建立線程執行個體的應用程式必須提供在該線程中運作的代碼。有兩種方法可以做到:
1,提供一個Runnable對象。runnable接口隻定義了一個run方法用來包含線上程中執行的方法。Runnable對象被傳遞給Thread的構造函數,如下HelloRunnable示例:
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
2,繼承Thread。Thread類本身實作了Runnable,盡管它的run方法什麼也不做。應用程式可以繼承線程,提供自己的運作實作,如下HelloThread示例中:
public class HelloThread extends Thread {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new HelloThread()).start();
}
}
我們注意到兩個例子中都調用了Thread.start以啟動線程(Thread)
那麼我們應該選擇哪一個方式呢?第一個使用Runnable對象的方式更通用,因為Runnable對象不僅可以子類化為Thread,也可以子類化為其他類。 第二種方式在簡單的應用程式中更容易使用,但由于任務類必須是線程的子類,是以受到限制。This lesson focuses on the first approach, which separates the
Runnable
task from the
Thread
object that executes the task. 本課重點介紹第一種方法,它将runnable任務與執行任務的thread對象分離開來。這種方法不僅更加靈活,而且适用于稍後讨論的進階線程管理api。