看完本文,不再怕問java線程建立的幾種方式了

常規面試必問,線程建立的方式有哪幾種,那麼回答有以下幾種:
面試

  1. 繼承Thread類編程

  2. 實現Runnable接口多線程

  3. 實現Callable接口(JDK1.5+)  ide

若是想了解具體怎麼建立的,請往下看:函數

繼承Thread類

    {
    
    
      () {
        
        ..();
        
    }
}
   {
       ([] ) {
        
            ();
        
        .();
         
    }
}

輸出:this

繼承Thread建立線程

注意spa

使用繼承Thread類的方法來建立線程類時候,多個線程之間是沒法共享線程類的實例變量的。線程

實現Runnable接口

覆寫Runnable接口實現多線程能夠避免單繼承侷限, 當子類實現Runnable接口,此時子類和Thread的代理模式(子類負責真實業務的操做,thread負責資源調度與線程建立輔助真實業務)。代理

     {
    
    
      () {
        
        ..();
        
    }
}
   {
       ([] ) {
            ();
            ();
        
        .();
    }
}

輸出:code

實現Runnable建立線程

注意

Runnable對象僅僅做爲Thread對象的target,Runnable實現類裏包含的run方法僅僅做爲線程的執行體,而實際的線程對象依舊是Thread實例,只是該Thread線程負責執行器target的方法。

覆寫Callable接口

     {
    
    
      ()   {
        
        ..();
         ;
    }
}
   {
       ([] )  ,  {
            ();
            ();
            ();
        .();
        
        ..(.());
    }
}

輸出:

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接口來建立多線程

相關文章
相關標籤/搜索