多線程--Thread和Runnable區別

  線程的建立有兩種方式,分別是繼承Thread類和實現Runnable接口,那麼這兩種方式有什麼相同點,以及區別在何處呢?java

  首先經過兩個實例還看一下他們的相同之處:編程

  實例1:使用繼承Thread類多線程

   建立子類MultiExtendThread:    ide

 

public class MultiExtendThread extends Thread {

    private   int ticket = 10;//每一個線程擁有10張票
    private String name;

    MultiThread3(String name) {
        this.name = name;
    }

    public void run() {
        while (ticket > 0) {
            System.out.println(ticket-- + " is saled by " + name);
        }
    }
}

   測試類:    測試

 

 

 public static void main(String[] args) {

        MultiExtendThread m1 = new MultiExtendThread ("Window 1");
        MultiExtendThread m2 = new MultiExtendThread ("Window 2");
        MultiExtendThread m3 = new MultiExtendThread ("Window 3");
        //建立3個線程
        Thread t1 = new Thread(m1 );
        Thread t2 = new Thread(m2);
        Thread t3 = new Thread(m3);

        t1.start();
        t2.start();
        t3.start();

    }

   測試結果:以多線程的形式各自打印出售票信息,每一個線程分別打印10條記錄,以下:this

 

                 


  實例2:使用實現Runnable接口方式spa

    實現Runnable接口的類:      線程

 

public class MultiThread1 implements Runnable {

    private int ticket = 10;//每一個線程都擁有10張票
    private String name;

    MultiThread1(String name) {

        this.name = name;

    }

    public void run() {

        while (ticket > 0) {

            System.out.println(ticket-- + " is saled by " + name);

        }

    }

   測試類:     code

 

 

public static void main(String[] args) {

        MultiThread1 m1 = new MultiThread1("Window 1");
        MultiThread1 m2 = new MultiThread1("Window 2");
        MultiThread1 m3 = new MultiThread1("Window 3");
        //建立3個線程
        Thread t1 = new Thread(m1 );
        Thread t2 = new Thread(m2);
        Thread t3 = new Thread(m3);

        t1.start();
        t2.start();
        t3.start();

    }

   測試結果同實例1對象

 

   經過以上兩個實例,來看一下二者的相同之處:

     均可以保證新建線程彼此相互獨立,各自擁有資源,互補干擾。在這樣的場景先,不管使用哪一種形式均可以。

   不一樣之處:

     java的一個特性是僅支持單繼承,這樣若是是經過繼承Thread來實現多線程時,該類將沒法再擴展其餘的類,不能實現負責的功能。而使用實現Runnable接口時,一樣還能夠實現其餘的接口,這樣就避免單繼承所帶來的侷限。還有一點是,實現Runnable接口建立的線程還能夠處理同一資源,實現資源的共享。

  實例3:多個售票窗口能夠共同售10張票   

 

public class MultiThread2 implements Runnable {

    private int ticket = 10;

    @Override
    public void run() {
        while (ticket > 0) {
            System.out.println(ticket-- + " is saled by " + Thread.currentThread().getName());

        }

    }
}

  測試類:    

 

 

public static void main(String[] args) {

        //建立一個實例
        MultiThread2 m = new MultiThread2();
        //建立三個線程,三個線程共同擁有同一個實例
        Thread t1 = new Thread(m, "Window 1");
        Thread t2 = new Thread(m, "Window 2");
        Thread t3 = new Thread(m, "Window 3");

        t1.start();
        t2.start();
        t3.start();

    }

   實例結果:

 

     


 總結:

 採用繼承Thread類方式:  (1)優勢:編寫簡單,若是須要訪問當前線程,無需使用Thread.currentThread()方法,直接使用this,便可得到當前線程。  (2)缺點:由於線程類已經繼承了Thread類,因此不能再繼承其餘的父類。  採用實現Runnable接口方式:  (1)優勢:線程類只是實現了Runable接口,還能夠繼承其餘的類。在這種方式下,能夠多個線程共享同一個目標對象,因此很是適合多個相同線程來處理同一份資源的狀況。  (2)缺點:編程稍微複雜,若是須要訪問當前線程,必須使用Thread.currentThread()方法。

相關文章
相關標籤/搜索