經過一系列的分析之後可以發現,在多線程的實現過程之中已經有了兩種做法: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(); //第三個線程啓動
}
}
通過內存圖來分析本程序的執行結構: