併發程式設計之多執行緒基礎-Thread和Runnable的區別及聯絡(二)
上篇文章講述了建立執行緒的常用方式
本篇主要分析一下Thread和Runnable兩種方式建立執行緒的區別及聯絡
聯絡:
▶Thread類實現了Runable介面。
▶都需要重寫裡面Run方法。
區別:
▶Thread方式不支援多繼承,Runnable方式支援多個實現
▶Runnable更容易實現資源共享,能多個執行緒同時處理一個資源。
疑惑分享:
本人在理解他們區別的時候
考慮到Thread類本身就是Runnable的實現類
所以產生了一個疑惑:-
為什麼Runnable可以實現共享而Thread卻不行呢
疑惑程式碼:
classThread1extends Thread {
inti = 100;
@Override
publicsynchronized void run() {
while(i > 0) {
System. out .println(Thread.currentThread ().getName() + "i:" + i);
i--;
}
}
}
publicclass TestThread {
publicstatic 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物件
他們對應的成員變數是互不影響的
所以就不能達到資源共享的效果
溫馨提示:
▶在學習過程中理解一些概念或者結論不清晰的時候,一定要親自動手結合著程式碼去分析,不要片面的理解一些知識點,一定要搞清實質。
▶本文內容如有不妥,懇請指正。