Thread與Runnable關係

經過一系列的分析之後可以發現,在多線程的實現過程之中已經有了兩種做法:Thread類、Runnable接口,如果從代碼的結構本身來講肯定是使用Runnable是最方便的,因爲其可以避免單繼承的侷限,同時也可以更好的進行功能的擴充。
但是從結構上也需要來觀察Thread與Runnable的聯繫,打開Thread類的定義:

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 i = 0; i < 10; i++) {
            System.out.println(this.title + "運行,X = " + i);
        }
    }
}
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類來處理。
在進行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 i = 0; i < 100; i++) {
            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(); //第三個線程啓動
    }
}

通過內存圖來分析本程序的執行結構:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章