多執行緒之實現Runnable與繼承Thread的區別
阿新 • • 發佈:2019-02-14
我在上一個部落格說了兩種實現多執行緒的方法,實現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、對情況的適應性高:適合於資源的共享。
但是我們發現雖然可以讓多個人打同一個人但是掉血的順序是錯的,為了讓他順序正確我們就要使用“鎖”這個東西的,這個東西我們以後再說