1. 程式人生 > >並發編程之多線程基礎-Thread和Runnable的區別及聯系(二)

並發編程之多線程基礎-Thread和Runnable的區別及聯系(二)

共享 聯系 star 沒有 static unable end 需要 read

上篇文章講述了創建線程的常用方式

本篇主要分析一下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對象

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

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

溫馨提示:

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

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

並發編程之多線程基礎-Thread和Runnable的區別及聯系(二)