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);
}
}
}