創建線程的目的是為了開啟一條執行路徑,去運行指定的代碼和其他代碼實現同時運行。
而運行的指定代碼就是者個執行路徑的任務。
JVM 創建的主線程任務都定義在主函數 中。
Thread 類用於描述線程,線程是需要任務的,所以 Thraed 類也是對任務的描述。
這個任務通過 Thread 類中的 run 方法來體現。
也就是說,run 方法就是封裝自定義線程運行任務的函數。
run 方法中定義的就是現成要運行的任務代碼。
開啟線程是為了運行指定代碼,所以只有繼承 Thread 類,並覆寫 run 方法。 將運行的代碼定義在 run 方法中即可。
定義一個類繼承 Thread 類。
重寫 Thread 中的 run() 方法。
直接創建 Thread 的子類對象創建線程。
調用 start 方法開啟線程並調用線程的任務 run 方法執行。
注意: 可以通過 Thread 的 getName 方法獲取線程的名稱 -> Thread - 編號(從 0 開始)
主線程的名字就是 main。
public class Demo extends Thread {
private String name ;
public Demo (String name ) {
super (name );//給線程命名(傳入 String 類型的參數)
this .name = name ;
}
public void run () {
for (int x = 0 ; x < 10 ; x ++) {
System .out .println (name + " @ x = " + x + " @ " + Thread .currentThread ().getName ());//獲取當前運行線程以及其名稱
}
}
}
public class ThreadDemo {
public static void main (String [] args ) {
Demo t1 = new Demo ("Jack" );
Demo t2 = new Demo ("Jacky" );
t1 .start ();//開啟線程,調用 run 方法
t2 .start ();
}
}
第一次打印
第二次打印
Jack @ x = 0 @ Jack
Jacky @ x = 0 @ Jacky
Jacky @ x = 0 @ Jacky
Jacky @ x = 1 @ Jacky
Jack @ x = 1 @ Jack
Jack @ x = 0 @ Jack
Jacky @ x = 1 @ Jacky
Jack @ x = 1 @ Jack
Jack @ x = 2 @ Jack
Jacky @ x = 2 @ Jacky
Jacky @ x = 2 @ Jacky
Jack @ x = 2 @ Jack
Jacky @ x = 3 @ Jacky
Jacky @ x = 3 @ Jacky
Jacky @ x = 4 @ Jacky
Jacky @ x = 4 @ Jacky
Jack @ x = 3 @ Jack
Jack @ x = 3 @ Jack
Jack @ x = 4 @ Jack
Jack @ x = 4 @ Jack
方式二: 實現 Runnable 接口(較為常用)
Runnable: 將線程的任務進行了對象的封裝。(Runnable 類型的對象)
好處:
將現成的任務從現成的子類中分離出來,進行了單獨的封裝。
按照面相對象的思想將任務封裝成對象。
避免了 Java 單繼承的侷限性。
定義類實現 Runnable 接口。
重寫接口中的 run 方法,將線程的任務代碼封裝到 run 方法中。
通過 Thread 類創建線程對象,並將 Runnable 接口的子類對象作為 Thread 類構造函數的參數進行傳遞。
因為現成的任務都封裝在 Runnable 接口子類對象的 run 方法中。
所以要在線程對象創建十就必須明確要運行的任務。
調用線程對象的 start 方法開啟線程。
注意: 方式二細節可查看 API 文檔加以了解。
Example
public class Demo implements Runnable {//準備擴展 Demo1 類的功能,讓其中內容可以作為線程的任務執行。
//通過接口的形式完成。
public void run () {
for (int x = 0 ; x < 5 ; x ++) {
System .out .println (Thread .currentThread ().getName () + " @ x = " + x );//獲取當前運行線程以及其名稱
}
}
}
public class ThreadDemo {
public static void main (String [] args ) {
Demo d = new Demo ();
Thread t1 = new Thread (d );//分配新的 Thread 對象 -> Thraed(Runnable target)
Thread t2 = new Thread (d );
t1 .start ();//開啟線程,調用 run 方法
t2 .start ();
}
}
第一次打印
第二次打印
Thread-0 @ x = 0
Thread-0 @ x = 0
Thread-0 @ x = 1
Thread-1 @ x = 0
Thread-0 @ x = 2
Thread-0 @ x = 1
Thread-1 @ x = 0
Thread-1 @ x = 1
Thread-0 @ x = 3
Thread-0 @ x = 2
Thread-0 @ x = 4
Thread-0 @ x = 3
Thread-1 @ x = 1
Thread-0 @ x = 4
Thread-1 @ x = 2
Thread-1 @ x = 2
Thread-1 @ x = 3
Thread-1 @ x = 3
Thread-1 @ x = 4
Thread-1 @ x = 4