“你好,Amigo!Ellie 向你介紹了線程,我將告訴你如何使用它們。要創建一個新線程,你需要:”

1) 創建線程對象

2)將它傳遞給你想要運行的方法

3) 在創建的Thread對像上調用start方法。

考慮這個例子:

代碼 描述
class Printer implements Runnable
{
public void run()
{
System.out.println("I’m printer");
}
}
實現Runnable接口的類。
public static void main(String[] args)
{
Printer printer = new Printer();
Thread childThread = new Thread(printer);
childThread.start();
}
1 創建 Printer 類的一個實例,它實現了 run 方法。
2 創建一個新的線程對象。我們將打印機對像傳遞給構造函數,需要調用其 run() 方法。3 通過調用start()
方法 啟動新線程。

小型 Java 程序通常由一個稱為“主線程”的線程組成。但是程序更經常啟動額外的線程,稱為“子線程”。主線程運行main方法並結束。Runnable的 run 方法是線程的類似方法。

“啊,很多線程意味著很多主要方法。”

創建和啟動新線程 - 1

要告訴 Thread 對象它應該啟動哪個特定方法,我們需要以某種方式將方法傳遞給它。在 Java 中,這是使用Runnable接口完成的。該接口包含一個抽象方法:void run()。Thread 類有一個Thread(Runnable Runnable)構造函數。您可以傳入任何實現Runnable接口的對象。

您的類必須繼承Runnable並覆蓋其運行方法。調用此方法是啟動新線程的方法。你可以在run方法中寫任何你想寫的東西。

代碼 描述
class Printer implements Runnable
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
實現 Runnable 接口的類。
public static void main(String[] args)
{
Printer printer1 = new Printer("Nick");
Thread thread1 = new Thread(printer1);
thread1.start();

Printer printer2 = new Printer("Jack");
Thread thread2 = new Thread(printer2);
thread2.start();
}
創建兩個線程,每個線程都將基於自己的 Printer 對象。
public static void main(String[] args)
{
Printer printer = new Printer("Natasha");

Thread thread1 = new Thread(printer);
thread1.start();

Thread thread2 = new Thread(printer);
thread2.start();

Thread thread3 = new Thread(printer);
thread3.start();
}
基於單個 Printer 對象創建三個線程。

更重要的是,您可以將所有這些組合到一個類中。Thread類繼承了Runnable接口所以只需要重寫它的run方法即可:

另一種創建新線程的方法
class Printer extends Thread
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
繼承Thread類,它實現了Runnable接口,然後重寫run方法。
public static void main(String[] args)
{
Printer printer = new Printer("Jack");
printer.start();

Printer printer2 = new Printer("Jack");
printer2.start();

}
創建兩個線程,每個線程都將基於自己的Printer對象。

“這是一個更優雅的解決方案。”

“是的,但它也有缺點:”

1) 您可能需要基於單個對象啟動多個線程,如 Natasha 的示例。

2) 如果繼承自Thread類,則不能在自己的類中添加另一個父類。

3) 如果你的類有一個父類,你不能添加Thread作為第二個父類。

“也就是說,調用start方法後,各個線程開始執行傳遞給構造函數的對象的run方法?”

“是的。如果沒有任何東西被傳遞給構造函數,那麼 Thread 只是執行它內部的 run 方法。”

“但是我們為什麼不直接這樣調用方法呢?”

代碼
public static void main(String[] args)
{
 Printer printer1 = new Printer("Nick");
 printer1.run();
}

“當主線程到達run方法時,它的“小機器人”就簡單地進入並執行其中的所有命令。只有在執行完它們後,它才會返回到main方法並繼續執行進一步的命令。因此,沒有第二個“小機器人”將被創建。所有工作將按順序執行,而不是並行(同時)執行。”

“我明白了。你能調用一些其他方法嗎,除了運行之外的方法?”

“不。它都與 Runnable 接口相關聯,該接口只“知道”其方法之一:run()。”