1. 程式人生 > >多執行緒之實現Runnable與繼承Thread的區別

多執行緒之實現Runnable與繼承Thread的區別

我在上一個部落格說了兩種實現多執行緒的方法,實現Runnable介面與繼承Thread類,表面上看他們都沒有什麼區別,但在實際使用中繼承Thread的較少,實現Runnable的較多。這說明他們之間還是有很大的區別的,下面我們看一下它們的區別:

我們首先給他們設定一個環境,People是一個類它或者實現了Runnable介面或者繼承了Thread類,同時他還有一個int屬性代表他的血量,初始值是10,在run函式中使當錢血量減一,(每一次呼叫代表這個被其他人打了)現在的情況是有很多人一起打這個人,讓我們看一下兩種實現的不同。

Runnable:

package P1;

public class People implements Runnable{
	int xue=10;
 @Override
public void run() {
	xue--;
	System.out.println("Oh i have "+xue+" xue new");
}
}
package P1;
public class MagicSquare {
   public static void main(String[] args){
	   People people=new People();
	   for(int i=1;i<=10;i++){
	   new Thread(people).start();
	   }
	   }
}

Oh i have 9 xue new
Oh i have 7 xue new
Oh i have 8 xue new
Oh i have 6 xue new
Oh i have 4 xue new
Oh i have 4 xue new
Oh i have 6 xue new
Oh i have 3 xue new
Oh i have 2 xue new
Oh i have 1 xue new

我們可以看出一個People例項可以構造多個執行緒並start(),(也就是可以有多個人打一個人)並且這些執行緒都共享這個例項的屬性,每一次更改都會對這個屬性進行影響。

之後是Thread:

package P1;

public class People extends Thread{
	int xue=10;
 @Override
public void run() {
	xue--;
	System.out.println("Oh i have "+xue+" xue new");
}
}
package P1;
public class MagicSquare {
   public static void main(String[] args){
	   People people=new People();
	   for(int i=1;i<=10;i++){
	     people.start();
	   }
   }
}
Exception in thread "main" Oh i have 9 xue new
java.lang.IllegalThreadStateException
	at java.lang.Thread.start(Unknown Source)
	at P1.MagicSquare.main(MagicSquare.java:6)

我們看到這時候People繼承Thread類並重寫run方法,但是我們在執行的時候卻報錯了,這證明繼承了Thread的類無法多次start(),(一個人只能被打一次),他不適應這種情況。

總結一下上面我們發現,實現Runnable介面相比繼承Thread類有如下好處:
1、介面的特性:避免繼承的侷限,一個類可以繼承多個介面。
2、對情況的適應性高:適合於資源的共享。


但是我們發現雖然可以讓多個人打同一個人但是掉血的順序是錯的,為了讓他順序正確我們就要使用“鎖”這個東西的,這個東西我們以後再說