1. 程式人生 > >java多執行緒之啟動執行緒的三種方式

java多執行緒之啟動執行緒的三種方式

java對多執行緒有著良好的支援,java建立和啟動執行緒較為常用的方式有繼承Thread類、實現Runnable介面和匿名內部類的方式。

1.繼承Thread類:

通過繼承Thread類來建立並啟動多執行緒步驟如下:

1、定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體就代表了執行緒需要完成的任務。因此把run方法稱為執行緒執行體。

2、建立Thread子類的例項,即建立了執行緒物件。

3、呼叫執行緒物件的start()方法來啟動該執行緒。

示例程式碼:

Thread1類(執行緒類):

public class Thread1 extends Thread{

	@Override
	public void run() {
		
		for (int i = 0; i < 50; i++) {
			System.out.println(Thread.currentThread().getName() + "執行" + i);
		}
	}
}

Mian類,測試類:

public class Main {
	
	public static void main(String[] args) {
		new Thread1().start();
		for (int i = 0; i < 50; i++) {
			System.out.println(Thread.currentThread().getName() + "執行" + i);
		}
	}
}

測試結果:

      可以看到main執行緒和thread0執行緒的for迴圈交替執行,執行緒啟動成功。此例項程式中Thread1類繼承了Thread類並重寫了run方法,在run方法中我們打印出當前執行的執行緒名稱為哪個執行緒正在執行了,執行了多少次,使用成員變數i來記錄執行的次數。在main函式中我們建立了此執行緒的例項物件,並通過start方法啟動了這個個執行緒,執行時大家可以看到執行緒是以搶佔式的方式執行。雖然只建立了1個執行緒例項,實際上共有2個執行緒在執行,還有main方法代表的主執行緒的執行緒執行體。

      此外,我們還學習了執行緒的兩個方法:

      1.Thread.currentThread(),是Thread類的靜態方法,該方法總是返回當前正在執行的執行緒物件。

      2.getName():該方法是Thread類的例項方法,該方法返當前正在執行的執行緒的名稱。在預設情況下,主執行緒的名稱為main,使用者啟動的多執行緒的名稱依次為Thread-0,Thread-1,Thread-3..Thread-n等。

2.實現Runnable介面:

實現Runnable介面建立並啟動多執行緒的步驟如下:

1.定義Runnable介面的實現類,並重寫該介面的run方法,該run方法的方法體同樣是該執行緒的執行緒執行體

2.建立Runnable實現類的例項物件,並以此例項物件作為Thread的target來建立Thread類,該Thread物件才是真正的執行緒物件。

3.呼叫執行緒物件的start()方法來啟動該執行緒。

示例程式碼:

Thread2類(執行緒類):

public class Thread2 implements Runnable{

	public void run() {
		
		for (int i = 0; i < 50; i++) {
			System.out.println(Thread.currentThread().getName() + "執行" + i);
		}
	}

}

Mian類:

public class Main {
	
	public static void main(String[] args) {
		new Thread(new Thread2()).start();
		for (int i = 0; i < 50; i++) {
			System.out.println(Thread.currentThread().getName() + "執行" + i);
		}
	}
}

      這裡尤其是注意:main函式中名沒有直接執行Thread2的run方法,而是將Thread2填入到了Thread中,使用start方法來啟動。Runable實現類裡包含run方法,僅僅作為執行緒執行體,而實際的執行緒物件依然是Thread例項物件,Thread為真正建立執行緒的物件。

3.匿名內部類:

      匿名內部類本質上也是一個類實現了Runnable介面,重寫了run方法,只不過這個類沒有名字,直接作為引數傳入Thread類,示例程式碼:

Main類:

public class Main {
	
	public static void main(String[] args) {
		new Thread(new Runnable() {
			
			public void run() {
				for (int i = 0; i < 50; i++) {
					System.out.println(Thread.currentThread().getName() + "執行" + i);
				}
			}
		}).start();
		for (int i = 0; i < 50; i++) {
			System.out.println(Thread.currentThread().getName() + "執行" + i);
		}
	}
}