多執行緒——Java中繼承Thread類與實現Runnable介面的區別
阿新 • • 發佈:2019-01-29
執行緒我只寫過繼承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介面的時候呼叫
如果第二種實現Runnable介面的方式要想達到第一種繼承Thread類的效果,可以這樣來例項化執行緒類。
//MyThread2 mt = new MyThread2();
Thread t1 = new Threadnew MyThread2(),"一號視窗");
Thread t2 = new Threadnew MyThread2(),"二號視窗");
Thread t3 = new Thread(new MyThread2(),"三號視窗");
總結
其實,抽象來說,這並不是Thread類和Runnable介面的區別了,這可以看做是介面和繼承的問題。我們弄懂了介面和繼承,就不難理解Thread和Runnable。
在剛接觸的時候可能會有些迷糊這二者的區別於聯絡,但是實踐和總結過後我們會發現這是兩個完全不同的實現多執行緒,一個是多個執行緒分別完成自己的任務,一個是多個執行緒共同完成一個任務。其實,在實現一個任務用多個執行緒來做也可以用繼承Thread類來實現,只是比較麻煩,一般我們用實現Runnable介面來實現。