- 通過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)增強了程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的。