Java多執行緒實現方式
阿新 • • 發佈:2021-10-17
執行緒的兩種實現方式:繼承Thread類,實現Runnable介面
1.繼承Thread
1 package demo; 2 3 public class Test { 4 public static void main(String[] args) { 5 MyThread m=new MyThread(); 6 m.start(); 7 for (int i=0;i<10;i++){ 8 System.out.println("main主執行緒"+i); 9 }10 } 11 } 12 package demo; 13 14 public class MyThread extends Thread{ 15 /** 16 * 17 * run方法就是執行緒要執行任務的方法 18 */ 19 @Override 20 public void run() { 21 //這裡的程式碼就是一條新的執行路徑 22 //這個執行路徑的觸發方式,不是呼叫run方法,而是通過thread物件的start()來啟動 23 for (int i=0;i<10;i++){ 24System.out.println("run方法執行了"+i); 25 } 26 } 27 } 28 要點:繼承Thread類,重寫run方法,在run方法內編寫程式碼實現業務。通過Thread例項的start方法啟動多執行緒。
1 package demo; 2 3 /** 4 * 用於給執行緒執行的任務 5 */ 6 public class MyRunnable implements Runnable { 7 8 @Override 9 public void run() {10 //執行緒的任務 11 for (int i=0;i<10;i++){ 12 System.out.println("run方法執行了"+i); 13 } 14 } 15 } 16 package demo; 17 18 public class Test { 19 public static void main(String[] args) { 20 //實現Runnable 21 //1.建立一個任務物件 22 MyRunnable r=new MyRunnable(); 23 //2、建立一個執行緒,為其分配一個任務 24 Thread t=new Thread(r); 25 //3.執行這個執行緒 26 t.start(); 27 for (int i=0;i<10;i++){ 28 System.out.println("main主執行緒"+i); 29 } 30 } 31 } 32 要點:實現Runnable介面,實現run方法,在run方法內編寫程式碼實現業務。通過Thread(new Runnable實現類)建構函式,構造Thread,通過Thread例項的start方法啟動多執行緒。Runnable就是任務。
Runnable是介面;
Thread 是類,Thread本身是實現了Runnable介面的類;
我們知道“一個類只能有一個父類,但是卻能實現多個介面”,因此Runnable具有更好的擴充套件性。
此外,Runnable還可以用於“資源的共享”。即,多個執行緒都是基於某一個Runnable物件建立的,它們會共享Runnable物件上的資源。
通常,建議通過“Runnable”實現多執行緒!
三. Runnable 與Thread相比,有如下優勢
1.通過建立任務,給執行緒分配任務的方式來實現額多執行緒,更適合多個執行緒同時執行相同任務的情況
2.可以避免單繼承所帶來的侷限性
3.任務與執行緒本身是分離的,提高了程式的健壯性
4.後續學習的執行緒池技術,接受Runnable型別的任務,不接收Thread型別的執行緒
四.為什麼執行緒通過start啟動,而不是run方法啟動
檢視Thread原始碼中的start方法
Thread呼叫start方法時,會啟動start0()方法,而start0()是一個native方法,此時然後java虛擬機器則會呼叫run方法,啟動另外一個執行緒,
而當前start方法繼續執行,這時有兩個執行緒同時執行,當start()方法執行完成之後,執行緒start方法執行結束,該執行緒不可以重新啟動。
繼續看run方法,如果是執行緒本身是通過實現Runnable介面構建的,那麼呼叫Runnable的run方法,否則呼叫重寫了run方法的Thread類的方法。
所以,只可以通過start方法啟動執行緒,而呼叫run方法時,只是呼叫run方法而已,不會啟動另外一個執行緒。
一旦涉及到多執行緒需要解決的問題,一般會有共享資源,那麼儘量採用實現Runnable介面的實現方式,可以在多執行緒之間共享資源。