並發編程之多線程基礎-Thread和Runnable的區別及聯系(二)
上篇文章講述了創建線程的常用方式
本篇主要分析一下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的區別及聯系(二)