何時繼承Thread類何時選擇實現Runnable介面
阿新 • • 發佈:2019-01-02
差別
1.繼承thread的類,在建立它的物件時,建立兩個thread,他們各自執行各自的程序,互不干擾,Thread類當中的資料也是彼此獨立。
但是在Runnable中,建立一個實現了Runnable介面的類的物件後,可以將這一個物件分別在建立程序時都傳遞給執行緒的建構函式:
ImplementRunnable r1 = new ImplementRunnable();
ImplementRunnable r2 = new ImplementRunnable();
Thread t1 = new Thread(r1, "張三");
Thread t2 = new Thread(r1, "lisi");
使得執行緒在執行時,呼叫的是同一個Runnable實現類物件,那麼Runnable實現類當中的資料,就是兩個執行緒共享的資料。
具體如下程式碼及其執行結構所示:
Runnable實現類
public class ImplementRunnable implements Runnable {
private int a = 0;
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0 ; i < 20; i++) {
System.out.println("Thread--" + Thread.currentThread().getName() + "--執行;a為:" + (a++));
}
}
}
**Thread繼承類**
public class ExtendThread extends Thread {
private int a = 0;
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for (int i = 0; i < 20; i++) {
System.out.println("Thread--" + getName() + "--執行;a為:" + (a++));
}
}
}
執行的呼叫類
public class ThreadText {
public static void main(String[] args) {
// TODO Auto-generated method stub
// ExtendThread thread1 = new ExtendThread();
// thread1.setName("張三");
// ExtendThread thread2 = new ExtendThread();
// thread2.setName("lisi");
// thread1.start();
// thread2.start();
ImplementRunnable r1 = new ImplementRunnable();
ImplementRunnable r2 = new ImplementRunnable();
Thread t1 = new Thread(r1, "張三");
Thread t2 = new Thread(r1, "lisi");
t1.start();
t2.start();
}
}
最後的執行結果:
在使用Runnable實現類的方法中,a的值是兩個執行緒共享的,每個執行緒執行20次,但是執行緒終端的地方是不一定的,所以有可能出現a執行緒執行++但是還沒有執行輸出結果就中斷了,然後b執行,所以就出現0在1前面了。
在使用Thread繼承類的方法時,建立兩個執行緒,各自執行,資料並不共享,各自執行20次迴圈。