Thread類和Runnable接口的區別

  • 通過Thread類和Runnable接口都可以實現多線程,但是兩者還是有區別的,如果一個類繼承Thread類,則不適合用於多線程資源共享;而實現了Runnable接口,就可以方便的實現資源的共享。

1、繼承Thread類不能資源共享

class MyThread extends Thread{
	private int ticket=5;
	public void run(){
		for(int i=0;i<100;i++){
			if(ticket>0){
			System.out.println(Thread.currentThread().getName()+"賣票:ticket"+ticket--);
			}
		}
	}
}

public class ThreadDemo{
	public static void main(String args[]){
		MyThread mt1=new MyThread();
		MyThread mt2=new MyThread();
		MyThread mt3=new MyThread();
		mt1.start();
		mt2.start();
		mt3.start();
	}
}

 輸出結果:

 

以上程序通過繼承Thread類實現了多線程,程序中啓動了3個線程,但是3個線程卻各自賣出了5張票,而不是一共賣出5張票達到資源共享的目的。

2、實現Runnable接口可以實現資源共享

class MyThread_9_7 implements Runnable{
	private int ticket=10;
	public void run(){
		for(int i=0;i<100;i++){
			if(ticket>0){
				System.out.println(Thread.currentThread().getName()+"買票:ticket="+ticket--);
			}
		}
	}
}

public class RunnableDemo02 {
	public static void main(String[] args) {
		MyThread_9_7 my=new MyThread_9_7();
		Thread t1=new Thread(my,"t1");
		t1.start();
		Thread t2=new Thread(my,"t2");
		t2.start();
		Thread t3=new Thread(my,"t3");
		t3.start();
	}
}

 輸出結果:

 從程序的運行結果可以清楚的發現,雖然以上程序啓動了3個線程,3個線程一共才賣出10票,即ticket的屬性被所有的線程對象共享。

  • 結論:繼承Thread類,就是多個線程各自完成自己的任務;實現Runnable接口,就是多個線程共同完成一個任務。

可見,實現Runnable接口相對於繼承Thread類來說,有如下優勢:

(1)適合相同程序的多個線程去處理同一資源的情況。

(2)可以避免由於Java的單繼承特性帶來的侷限。

(3)增強了程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的。

 

 

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