1. 程式人生 > >多執行緒——Java中繼承Thread類與實現Runnable介面的區別

多執行緒——Java中繼承Thread類與實現Runnable介面的區別

執行緒我只寫過繼承Thread類的,後來知道java多執行緒有三種方式,今天首先比較一下常用的繼承Thread類和實現Runnable介面的區別。

按著Ctrl鍵進入Thread之後,發現Thread類也是Runnable介面的之類,這應該就是它們之間的聯絡了吧。

繼承Thread類 

class MyThread1 extends Thread{
    private int breakfast=10;
    private String name;
    public MyThread1(String name){
        this.name=name;
    }
    public void run(){
        for(int i =0;i<500;i++){
            if(this.breakfast>0){
                System.out.println(this.name+"賣早餐---->"+(this.breakfast--));
            }
        }
    }
    public static void main(String[] args) {
        MyThread1 mt1= new MyThread1("一號視窗");
        MyThread1 mt2= new MyThread1("二號視窗");
        MyThread1 mt3= new MyThread1("三號視窗");
        mt1.start();
        mt2.start();
        mt3.start();
    }
}


實現Runnable介面

class MyThread2 implements Runnable{
    private int breakfast =10;
    private String name;
    public void run(){
        for(int i =0;i<500;i++){
            if(this.breakfast>0){
                System.out.println(Thread.currentThread().getName()+"賣早餐---->"+(this.breakfast--));
            }
        }
    }

    public static void main(String[] args) {
        //設計三個執行緒
        MyThread2 mt = new MyThread2();
        Thread t1 = new Thread(mt,"一號視窗");
        Thread t2 = new Thread(mt,"二號視窗");
        Thread t3 = new Thread(mt,"三號視窗");
        t1.start();
        t2.start();
        t3.start();
    }
}

顯然,這兩個結果是不同的。為什麼會這樣呢?我們來分析一下。

其實,第一個繼承Thread類來實現多執行緒,其實是相當於拿出三件事即三個賣早餐10份的任務分別分給三個視窗,他們各做各的事各賣各的早餐各完成各的任務,因為MyThread繼承Thread類,所以在newMyThread的時候在建立三個物件的同時建立了三個執行緒;實現Runnable的, 相當於是拿出一個賣早餐10份的任務給三個人去共同完成,newMyThread相當於建立一個任務,然後例項化三個Thread,建立三個執行緒即安排三個視窗去執行。


一個類只能繼承一個父類,存在侷限;一個類可以實現多個介面。在實現Runnable介面的時候呼叫

ThreadThread(Runnable run)或者Thread(Runnablerun,String name)構造方法建立程序時,使用同一個Runnable例項,建立的多執行緒的例項變數也是共享的;但是通過繼承Thread類是不能用一個例項建立多個執行緒,故而實現Runnable介面適合於資源共享;當然,繼承Thread類也能夠共享變數,能共享Thread類的static變數;

如果第二種實現Runnable介面的方式要想達到第一種繼承Thread類的效果,可以這樣來例項化執行緒類。

        //MyThread2 mt = new MyThread2();
        Thread t1 = new Threadnew MyThread2(),"一號視窗");
        Thread t2 = new Threadnew MyThread2(),"二號視窗");
        Thread t3 = new Thread(new MyThread2(),"三號視窗");

總結

其實,抽象來說,這並不是Thread類和Runnable介面的區別了,這可以看做是介面和繼承的問題。我們弄懂了介面和繼承,就不難理解ThreadRunnable

在剛接觸的時候可能會有些迷糊這二者的區別於聯絡,但是實踐和總結過後我們會發現這是兩個完全不同的實現多執行緒,一個是多個執行緒分別完成自己的任務,一個是多個執行緒共同完成一個任務。其實,在實現一個任務用多個執行緒來做也可以用繼承Thread類來實現,只是比較麻煩,一般我們用實現Runnable介面來實現。