天天看點

深入剖析Thread與Runnable關系 | 帶你學《Java語言進階特性》之四

上一篇:看Runnable如何巧避單繼承限制 | 帶你學《Java語言進階特性》之三

【本節目标】

通過閱讀本節内容,你将通過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關系 | 帶你學《Java語言進階特性》之四

圖一 Thread與Runnable關系

多線程的設計之中,使用了代理設計模式的結構,使用者自定義的線程主體隻是負責項目核心的實作,而所有的輔助實作全部交由Thread類處理。

在進行Thread啟動多線程的時候調用的是start()方法,而後找到的是run()方法,但通過Thread類的構造方法傳遞了一個Runnable接口對象時,那麼該接口對象将被Thread類中的target屬性所儲存,在start()方法執行時會調用Thread中的run()方法,而這個run()方法去調用Runnable接口子類被覆寫過的run()方法。

多線程開發的本質實質上是在于多個線程可以進行同一資源的搶占,那麼Thread主要描述的是線程,而資源的描述是通過Runnable完成的。

深入剖析Thread與Runnable關系 | 帶你學《Java語言進階特性》之四

圖二 多線程開發

範例:利用賣票程式來實作多個線程的資源并發通路

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();      //第三個線程啟動
    }
}           
深入剖析Thread與Runnable關系 | 帶你學《Java語言進階特性》之四

圖三 賣票實作多個線程的資源并發通路

通過記憶體分析圖來分析本程式的執行結構。

深入剖析Thread與Runnable關系 | 帶你學《Java語言進階特性》之四

圖四 程式的記憶體分析圖

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:進一步探索多線程的實作 | 帶你學《Java語言進階特性》之五 更多Java面向對象程式設計文章檢視此處