1. 程式人生 > 其它 >Java多執行緒實現方式

Java多執行緒實現方式

一.多執行緒的實現方式

執行緒的兩種實現方式:繼承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++){ 24
System.out.println("run方法執行了"+i); 25 } 26 } 27 } 28 要點:繼承Thread類,重寫run方法,在run方法內編寫程式碼實現業務。通過Thread例項的start方法啟動多執行緒。
2.實現Runnable介面
 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就是任務。

二.Thread 和 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介面的實現方式,可以在多執行緒之間共享資源。