Java學習提要——淺述'Thread類'和'Runnable接口'的區別

使用Runnable接口與Thread類相比,解決了單繼承的侷限,僅僅這一點,就讓Runnable接口的應用多得多了

1.
觀察Thread類的定義:
public class Thread extends Object implements Runnable
這種結構如果畫圖分析的話,非常像代理設計模式,但是又不是,因爲客戶端調用代理類的方法,不是接口裏提供的方法,也就是run()方法。

2.
Runnable接口和Thread類都可以描述數據共享,但是Runnable接口更適合多個相同的程序代碼的線程去處理同一個資源的操作
數據共享,即多個線程訪問同一資源的操作,
例:

//Thread類
class MyThread extends Thread{
    private int ticket = 10 ;
    public void run() {
        for (int x=0 ; x < 100 ; x++){
            if(this.ticket > 0) {
                    System.out.println("ticket =" + this.ticket--);
            }
        }
    }
}
public class Nice {
    public static void main(String args[]) {
        //每一個類都有start()方法,所以每一個類對象就是一個線程對象,可以直接啓動
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();
        MyThread mt3 = new MyThread();
        mt1.start() ;  
        mt2.start() ;
        mt3.start() ;
        //若是三個名稱一樣,那麼會有異常拋出
    }
}
//三個類的對象,分別調用三次start()方法,但是發現每一個線程都是買自己的10張票,沒有資源共享
//Runnable接口
class MyThread implements Runnable {
    private int ticket = 10 ;
    public void run() {
        for (int x=0 ; x < 100 ; x++){
            if(this.ticket > 0) {
                System.out.println("ticket =" + this.ticket--);
            }
        }
    }
}
public class Nice {
    public static void main(String args[]) {
        MyThread mt = new MyThread();
        new Thread(mt).start() ;  //Thread類不可以這樣,因爲它本身就是Thread,不需要這樣調用
        new Thread(mt).start() ;
        new Thread(mt).start() ;
    }
}
//此時也屬於三個線程對象,區別是,這三個線程對象都直接佔用了MyThread類對象引用,即他們都直接訪問同一個資源

解釋Thread類與Runnable接口實現多線程的區別?(面試題:解釋多線程兩種實現方式的區別?)

1. Thread類是Runnable接口的子類,使用Runnable接口可以避免單繼承侷限
2. Runnable接口實現的多線程,可以比Thread類實現的多線程更加清楚的描述數據共享的概念

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