【本節目标】
通過閱讀本節内容,你将通過Thread類的定義及其具體代碼發現它與Runnable的内在聯系,對多線程的概念有更深入的了解。
Thread與Runnable關系
經過一系列的分析之後可以發現,在多線程的實作過程之中已經有了兩種做法:Thread類、Runnable接口,如果從代碼結構本身來講,肯定是使用Runnable是最友善的,因為其可以避免單繼承的局限,同時也可以更好的進行功能的擴充。
但是從結構上也需要來觀察Thread和Runnable的聯系,打開Thead的定義:
public class Thread extends Object implements Runnable {}
發現Thread類也是Runnable接口的子類,是以繼承Thread類時覆寫的還是Runnable接口的run()方法,于是此時觀察一下程式的類結構。
class MyThread implements Runnable { //線程的主體類
private String title;
public MyThread(String title) {
this.title = title;
}
@Override
public void run() { //線程的主體方法
for (int x = 0; x < 10; x++) {
System.out.println(this.title + "運作,x = "+ x);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
Thread threadA=new Thread(new MyThread("線程對象A"));
Thread threadB=new Thread(new MyThread("線程對象B"));
Thread threadC=new Thread(new MyThread("線程對象C"));
threadA.start(); //啟動多線程
threadB.start(); //啟動多線程
threadC.start(); //啟動多線程
}
}

圖一 Thread與Runnable關系
多線程的設計之中,使用了代理設計模式的結構,使用者自定義的線程主體隻是負責項目核心的實作,而所有的輔助實作全部交由Thread類處理。
在進行Thread啟動多線程的時候調用的是start()方法,而後找到的是run()方法,但通過Thread類的構造方法傳遞了一個Runnable接口對象時,那麼該接口對象将被Thread類中的target屬性所儲存,在start()方法執行時會調用Thread中的run()方法,而這個run()方法去調用Runnable接口子類被覆寫過的run()方法。
多線程開發的本質實質上是在于多個線程可以進行同一資源的搶占,那麼Thread主要描述的是線程,而資源的描述是通過Runnable完成的。
圖二 多線程開發
範例:利用賣票程式來實作多個線程的資源并發通路
class MyThread implements Runnable { //線程的主體類
private int ticket = 5;
@Override
public void run() { //線程的主體方法
for (int x = 0; x < 100; x++) {
if (this.ticket > 0)
System.out.println("賣票,ticket ="+ this.ticket--);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt).start(); //第一個線程啟動
new Thread(mt).start(); //第二個線程啟動
new Thread(mt).start(); //第三個線程啟動
}
}
圖三 賣票實作多個線程的資源并發通路
通過記憶體分析圖來分析本程式的執行結構。
圖四 程式的記憶體分析圖
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:進一步探索多線程的實作 | 帶你學《Java語言進階特性》之五 更多Java面向對象程式設計文章檢視此處