線程我只寫過繼承Thread類的,後來知道java多線程有三種方式,今天首先比較一下經常使用的繼承Thread類和實現Runnable接口的區別。html
按着Ctrl鍵進入Thread以後,發現Thread類也是Runnable接口的之類,這應該就是它們之間的聯繫了吧。java
顯然,這兩個結果是不一樣的。爲何會這樣呢?咱們來分析一下。多線程
其實,第一個繼承Thread類來實現多線程,實際上是至關於拿出三件事即三個賣早餐10份的任務分別分給三個窗口,他們各作各的事各賣各的早餐各完成各的任務,由於MyThread繼承Thread類,因此在newMyThread的時候在建立三個對象的同時建立了三個線程;實現Runnable的, 至關因而拿出一個賣早餐10份的任務給三我的去共同完成,newMyThread至關於建立一個任務,而後實例化三個Thread,建立三個線程即安排三個窗口去執行。post
一個類只能繼承一個父類,存在侷限;一個類能夠實現多個接口。在實現Runnable接口的時候調用Thread的Thread(Runnable run)或者Thread(Runnablerun,String name)構造方法建立進程時,使用同一個Runnable實例,創建的多線程的實例變量也是共享的;可是經過繼承Thread類是不能用一個實例創建多個線程,故而實現Runnable接口適合於資源共享;固然,繼承Thread類也可以共享變量,能共享Thread類的static變量;this
若是第二種實現Runnable接口的方式要想達到第一種繼承Thread類的效果,能夠這樣來實例化線程類。spa
其實,抽象來講,這並非Thread類和Runnable接口的區別了,這能夠看作是接口和繼承的問題。咱們弄懂了接口和繼承,就不難理解Thread和Runnable。.net
在剛接觸的時候可能會有些迷糊這兩者的區別於聯繫,可是實踐和總結事後咱們會發現這是兩個徹底不一樣的實現多線程,一個是多個線程分別完成本身的任務,一個是多個線程共同完成一個任務。其實,在實現一個任務用多個線程來作也能夠用繼承Thread類來實現,只是比較麻煩,通常咱們用實現Runnable接口來實現。線程