Skip to content

Latest commit

 

History

History
123 lines (99 loc) · 4.13 KB

創建線程.md

File metadata and controls

123 lines (99 loc) · 4.13 KB

創建線程

概述

  • 創建線程的目的是為了開啟一條執行路徑,去運行指定的代碼和其他代碼實現同時運行。 而運行的指定代碼就是者個執行路徑的任務。 JVM 創建的主線程任務都定義在主函數中。 Thread 類用於描述線程,線程是需要任務的,所以 Thraed 類也是對任務的描述。 這個任務通過 Thread 類中的 run 方法來體現。 也就是說,run 方法就是封裝自定義線程運行任務的函數。 run 方法中定義的就是現成要運行的任務代碼。 開啟線程是為了運行指定代碼,所以只有繼承 Thread 類,並覆寫 run 方法。 將運行的代碼定義在 run 方法中即可。

方式一: 繼承 Thread 類。

  • 步驟:
  1. 定義一個類繼承 Thread 類。
  2. 重寫 Thread 中的 run() 方法。
  3. 直接創建 Thread 的子類對象創建線程。
  4. 調用 start 方法開啟線程並調用線程的任務 run 方法執行。 注意: 可以通過 Thread 的 getName 方法獲取線程的名稱 -> Thread - 編號(從 0 開始) 主線程的名字就是 main。
  • Example
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 類型的對象)
  • 好處:
  1. 將現成的任務從現成的子類中分離出來,進行了單獨的封裝。 按照面相對象的思想將任務封裝成對象。
  2. 避免了 Java 單繼承的侷限性。
  • 步驟
  1. 定義類實現 Runnable 接口。
  2. 重寫接口中的 run 方法,將線程的任務代碼封裝到 run 方法中。
  3. 通過 Thread 類創建線程對象,並將 Runnable 接口的子類對象作為 Thread 類構造函數的參數進行傳遞。 因為現成的任務都封裝在 Runnable 接口子類對象的 run 方法中。 所以要在線程對象創建十就必須明確要運行的任務。
  4. 調用線程對象的 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