多線程——Java中繼承Thread類與實現Runnable接口的區別


線程我只寫過繼承Thread類的,后來知道java多線程有三種方式,今天首先比較一下常用的繼承Thread類和實現Runnable接口的區別。

              按着Ctrl鍵進入Thread之后,發現Thread類也是Runnable接口的之類,這應該就是它們之間的聯系了吧。

 

繼承Thread類  

 

  1.  
    class MyThread1 extends Thread{
  2.  
    private int breakfast=10;
  3.  
    private String name;
  4.  
    public MyThread1(String name){
  5.  
    this.name=name;
  6.  
    }
  7.  
    public void run(){
  8.  
    for(int i =0;i<500;i++){
  9.  
    if(this.breakfast>0){
  10.  
    System.out.println( this.name+"賣早餐---->"+(this.breakfast--));
  11.  
    }
  12.  
    }
  13.  
    }
  14.  
    public static void main(String[] args) {
  15.  
    MyThread1 mt1= new MyThread1("一號窗口");
  16.  
    MyThread1 mt2= new MyThread1("二號窗口");
  17.  
    MyThread1 mt3= new MyThread1("三號窗口");
  18.  
    mt1.start();
  19.  
    mt2.start();
  20.  
    mt3.start();
  21.  
    }
  22.  
    }

 


 

 

實現Runnable接口

  1.  
    class MyThread2 implements Runnable{
  2.  
    private int breakfast =10;
  3.  
    private String name;
  4.  
    public void run(){
  5.  
    for(int i =0;i<500;i++){
  6.  
    if(this.breakfast>0){
  7.  
    System.out.println(Thread.currentThread().getName()+ "賣早餐---->"+(this.breakfast--));
  8.  
    }
  9.  
    }
  10.  
    }
  11.  
     
  12.  
    public static void main(String[] args) {
  13.  
    //設計三個線程
  14.  
    MyThread2 mt = new MyThread2();
  15.  
    Thread t1 = new Thread(mt,"一號窗口");
  16.  
    Thread t2 = new Thread(mt,"二號窗口");
  17.  
    Thread t3 = new Thread(mt,"三號窗口");
  18.  
    t1.start();
  19.  
    t2.start();
  20.  
    t3.start();
  21.  
    }
  22.  
    }

 

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

              其實,第一個繼承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類的效果,可以這樣來實例化線程類。

  1.  
    //MyThread2 mt = new MyThread2();
  2.  
    Thread t1 = new Threadnew MyThread2(),"一號窗口");
  3.  
    Thread t2 = new Threadnew MyThread2(),"二號窗口");
  4.  
    Thread t3 = new Thread(new MyThread2(),"三號窗口");

 

總結

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

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

轉載。 https://blog.csdn.net/xdd19910505/article/details/50732328


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM