1. 程式人生 > 實用技巧 >Thread和Runnable的區別

Thread和Runnable的區別

【區別】Thread是類,Runnable是介面。

【聯絡】Thread類實現了Runnable介面

【Thread示例】

class MyThread extends Thread{  
  private int ticket=10;  
  public void run(){  
    for(int i=0;i<20;i++){  
      if(this.ticket>0){  
        System.out.println("賣票:ticket"+this.ticket--);  
      }  
    }  
  }  
}; 

public class
ThreadTicket { public static void main(String[] args) { MyThread mt1=new MyThread(); MyThread mt2=new MyThread(); MyThread mt3=new MyThread(); mt1.start(); mt2.start(); mt3.start(); } }

start方法 VS run方法

  1. start()用來啟動一個新執行緒,通過Thead類中start()方法來啟動的執行緒處於就緒狀態(可執行狀態),此時並沒有執行,一旦得到CPU時間片,就自動開始執行run()方法。此時不需要等待run()方法執行完也可以繼續執行下面的程式碼。
  2. run()是在本執行緒裡的,只是執行緒裡的一個函式。如果直接呼叫run(),就相當於是呼叫了一個普通函式,必須等待run()方法執行完畢才能執行下面的程式碼。所以在多執行緒執行時要使用start()方法而不是run()方法。

執行結果

每個執行緒都各賣了10張,共賣了30張票。但實際只有10張票。每個執行緒都賣自己的票,沒有達到資源共享。

【Runnable示例】

class MyThread implements Runnable{  
  private int ticket=10;  
  public void run(){  
    for(int i=0;i<20;i++){  
      
if(this.ticket>0){ System.out.println("賣票:ticket"+this.ticket--); } } } } public class RunnableTicket { public static void main(String[] args) { MyThread mt=new MyThread(); new Thread(mt).start(); //在Thread中不可以用同一個例項化物件mt,否則就會出現異常 new Thread(mt).start(); new Thread(mt).start(); } };

執行結果:三個執行緒一共賣了10張票,達到了資源共享。

【Runnable比Thread的優勢】

  1. 避免點繼承的侷限,一個類可以實現多個介面。
  2. 支援多執行緒間的資源共享