1. 程式人生 > >實現多執行緒有兩種方式及其區別

實現多執行緒有兩種方式及其區別

實現多執行緒有兩種方式:(自JDK1.5之後有三種,最後一種並不常用)

   1.繼承Thread類

   2.實現Runnable介面(Callable介面)

一個類如果實現了Runnable介面或者繼承了Thread類,那麼它就是一個多執行緒類,如果是要實現多執行緒,還需要重寫run()方法,所以run() 方法是多執行緒的入口。

但是在啟動多執行緒的時候,不是從run()方法開始的,而是從start()開始的 理由是:當執行多執行緒的時候,每一個執行緒會搶佔資源,而作業系統會為其分配資源,在start()方法中不僅執行了多執行緒的程式碼,除此還呼叫了一個start0()方法,該方法的宣告是native,在Java語言中用一種技術叫做JNI,即JavaNativeInterface,該技術特點是使用Java呼叫本機作業系統提供的函式,但是有一個缺點是不能離開特定的作業系統,如果執行緒需要執行,必須有作業系統去分配資源,所以此操作主要是JVM根據不同的作業系統來實現的

如果多執行緒是通過實現Runnable介面來實現的,那麼與通過繼承Thread來實現有一個區別,那就是多執行緒的啟動方式——必須是通過start()來啟動,但是Runnable介面只有一個方法,並沒有start()方法,所以在啟動多執行緒的時候必須呼叫Thread類的一個構造方法——Thread(Runnable target),該構造方法得到了Runnable介面的一個實現,於是就可以呼叫Thread類的start()方法了。

多執行緒的兩種實現方式的區別:

   1.Thread是Runnable介面的子類,實現Runnable介面的方式解決了Java單繼承的侷限

   2.Runnable介面實現多執行緒比繼承Thread類更加能描述資料共享的概念

注意:通過實現Runnable介面解決了Java單繼承的侷限,所以不管其他的區別聯絡是什麼,這一點就決定了多執行緒最好是通過實現Runnable介面的方式

關於資料共享的簡單例子如下:

 public class Thread_1 implements Runnable {

 int ticket=10;

 @Override  public void run()

{   

for (int i = 0; i < 100; i++) {  

    if(ticket>0){  

     System.out.println(ticket--);

     }

  }  

}  

public static void main(String[] args) {

     /*Thread_1 thread_1=new Thread_1();  

      new Thread(thread_1).start();   

     new Thread(thread_1).start();  

     new Thread(thread_1).start();*/   

  MyThread myThread1=new MyThread();  

      MyThread myThread2=new MyThread();

      MyThread myThread3=new MyThread();   

      myThread1.start();

       myThread2.start();  

      myThread3.start();     

 }

} class MyThread extends Thread{

 int ticket=10;

 @Override  public void run() {

  for (int i = 0; i < 100; i++) {

     if(ticket>0){    

               System.out.println(ticket--);

     }   

  }   

  }

}

 例子解析:

當通過繼承Thread類實現多執行緒的時候,每一個物件持有各自的10張ticket,而不是共用10張ticket,所以程式執行會重複三次,如果通過實現Runnable介面,則是三個物件共享10張ticket,實現了資料的共享。