1. 程式人生 > >實現多執行緒的兩種方式,區別和好處有哪些

實現多執行緒的兩種方式,區別和好處有哪些

 一種是擴充套件java.lang.Thread類
另一種是實現java.lang.Runnable介面

區別就是:第一種是擴充套件,第二種是實現
好處就是:
在實際開發中通常以實現Runnable介面為主,因為實現Runnable介面相比繼承Thread類可以避免繼承的侷限,一個類可以繼承多個介面,適合於資源的共享。

以賣票程式為例,通過Thread類完成:
package org.demo.dff;
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--);
            }
        }
    }
};
下面通過三個執行緒物件,同時賣票:
package org.demo.dff;
public class ThreadTicket {
    public static void main(String[] args) {
        MyThread mt1=new MyThread();
        MyThread mt2=new MyThread();
        MyThread mt3=new MyThread();
        mt1.start();//每個執行緒都各賣了10張,共賣了30張票
        mt2.start();//但實際只有10張票,每個執行緒都賣自己的票
        mt3.start();//沒有達到資源共享
    }
}
如果用Runnable就可以實現資源共享,下面看例子:
package org.demo.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--);
            }
        }
    }
}
package org.demo.runnable;
public class RunnableTicket {
    public static void main(String[] args) {
        MyThread mt=new MyThread();
        new Thread(mt).start();//同一個mt,但是在Thread中就不可以,如果用同一
        new Thread(mt).start();//個例項化物件mt,就會出現異常
        new Thread(mt).start();
    }
};
雖然現在程式中有三個執行緒,但是一共賣了10張票,也就是說使用Runnable實現多執行緒可以達到資源共享目的。

Runnable介面和Thread之間的聯絡:
public class Thread extends Object implements Runnable

 1)適合多個相同程式程式碼的執行緒去處理同一資源的情況,把虛擬CPU(執行緒)同程式的程式碼,資料有效的分離,較好地體現了面向物件的設計思想。
(2)可以避免由於Java的單繼承特性帶來的侷限。我們經常碰到這樣一種情況,即當我們要將已經繼承了某一個類的子類放入多執行緒中,由於一個類不能同時有兩個父類,所以不能用繼承Thread類的方式,那麼,這個類就只能採用實現Runnable介面的方式了。
(3)有利於程式的健壯性,程式碼能夠被多個執行緒共享,程式碼與資料是獨立的。當多個執行緒的執行程式碼來自同一個類的例項時,即稱它們共享相同的程式碼。多個執行緒操作相同的資料,與它們的程式碼無關。當共享訪問相同的物件是,即它們共享相同的資料。當執行緒被構造時,需要的程式碼和資料通過一個物件作為建構函式實參傳遞進去,這個物件就是一個實現了Runnable介面的類的例項。