常規面試必問,線程建立的方式有哪幾種,那麼回答有以下幾種:
面試
繼承Thread類編程
實現Runnable接口多線程
實現Callable接口(JDK1.5
+) ide
若是想了解具體怎麼建立的,請往下看:函數
{ () { ..(); } } { ([] ) { (); .(); } }
輸出:this
繼承Thread建立線程
注意spa
使用繼承Thread類的方法來建立線程類時候,多個線程之間是沒法共享線程類的實例變量的。線程
覆寫Runnable接口實現多線程能夠避免單繼承侷限, 當子類實現Runnable接口,此時子類和Thread的代理模式(子類負責真實業務的操做,thread負責資源調度與線程建立輔助真實業務)。代理
{ () { ..(); } } { ([] ) { (); (); .(); } }
輸出:code
實現Runnable建立線程
注意
Runnable對象僅僅做爲Thread對象的target,Runnable實現類裏包含的run方法僅僅做爲線程的執行體,而實際的線程對象依舊是Thread實例,只是該Thread線程負責執行器target的方法。
{ () { ..(); ; } } { ([] ) , { (); (); (); .(); ..(.()); } }
輸出:
999
注意
Callable接口有泛型限制,Callable接口裏的泛型形參類型與call方法返回值類型相同,並且Callable接口是函數式接口,所以可使用Lambda表達式建立Callable對象。
三種方式的對比
經過繼承Thread類或者實現Runnable接口、Callable接口均可以實現多線程,不過實現Runnable接口與實現Callable接口的方式基本相同,只是Callabl接口裏定義的方法返回值,能夠聲明拋出異常而已。所以將實現Runnable接口和實現Callable接口歸爲一種方式。這種方式與繼承Thread方式之間的主要差異以下。
採用實現Runnable、Callable接口的方式建立線程的優缺點:
優勢
線程類只是實現了Runnable或者Callable接口,還能夠繼承其餘類。這種方式下,多個線程能夠共享一個target對象,因此很是適合多個相同線程來處理同一份資源的狀況,從而能夠將CPU、代碼和數據分開,造成清晰的模型,較好的體現了面向對象的思想。
缺點
編程稍微複雜一些,若是須要訪問當前線程,則必須使用
Thread.currentThread()方法
採 用繼承Thread類的方式建立線程的優缺點:
缺點
由於線程類已經繼承了Thread類,Java語言是單繼承的,因此就不能再繼承其餘父類了。
優勢
編寫簡單,若是須要訪問當前線程,則無需使用
Thread.currentThread()方法,直接使用this便可獲取當前線程
鑑於上面分析,所以通常建議採用實現Runnable或Callable接口來建立多線程