上篇文章講述了建立執行緒的常用方式

本篇主要分析一下Thread和Runnable兩種方式建立執行緒的區別及聯絡

聯絡:

▶Thread類實現了Runable介面。

▶都需要重寫裡面Run方法。

區別:

▶Thread方式不支援多繼承,Runnable方式支援多個實現

▶Runnable更容易實現資源共享,能多個執行緒同時處理一個資源。

疑惑分享:

本人在理解他們區別的時候

考慮到Thread類本身就是Runnable的實現類

所以產生了一個疑惑:-

為什麼Runnable可以實現共享而Thread卻不行呢

疑惑程式碼:

class Thread1 extends Thread {

  int i = 100;

  @Override

  public synchronized void run() {

     while (i > 0) {

  System.out.println(Thread.currentThread().getName() + "i:" + i);

       i--;

     }

  }

}

public class TestThread {

  public static void main(String[] args) {

     Thread1 te1 = new Thread1();

     Thread t1 = new Thread(te1, "window1");

     Thread t2 = new Thread(te1, "window2");

     t1.start();

     t2.start();

  }

}

下面我們就來聊一聊(有共同疑惑的朋友們可以參考一下):

首先我們要清楚Thread和Runnable兩種方式的本質區別在哪裡

我們知道無論使用哪種方式最終都會通過 Thread類物件呼叫start方法進行開啟執行緒

本質的區別就在於:

Thread方式是呼叫無參構造方法

Runnable方式是呼叫帶有Runnable引數的有參構造方法

我們說過Thread類實現了Runable介面

以上疑惑程式碼中就是向Thread構造方法中傳遞了一個Tel1引數

看似與Runnable沒有關係

但實質上是屬於常說的Runnable方式呼叫

對應原始碼:Thread(Runnable target, String name)

那麼有參和無參有什麼區別是什麼呢,為什麼runnable能實現資源共享:

參考原始碼:

this.target = paramRunnable;

public void run()

  {

    if (this.target != null)

      this.target.run();

  }

有參:

如果是引數中Runnable不為空

那麼Thread run方法中最終執行的方法實際上是傳進來Runnable中的run方法

所以使用Runnable方式 無論new出多少個Thread物件

最終執行的任務都是一樣的

自然就實現了資源的共享

無參:

每次new出Thread物件

他們對應的成員變數是互不影響的

所以就不能達到資源共享的效果

溫馨提示:

▶在學習過程中理解一些概念或者結論不清晰的時候,一定要親自動手結合著程式碼去分析,不要片面的理解一些知識點,一定要搞清實質。

▶本文內容如有不妥,懇請指正。