使用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類實現的多線程更加清楚的描述數據共享的概念