1. 程式人生 > >何時繼承Thread類何時選擇實現Runnable介面

何時繼承Thread類何時選擇實現Runnable介面

差別
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實現類的執行結果

在使用Runnable實現類的方法中,a的值是兩個執行緒共享的,每個執行緒執行20次,但是執行緒終端的地方是不一定的,所以有可能出現a執行緒執行++但是還沒有執行輸出結果就中斷了,然後b執行,所以就出現0在1前面了。

Thread繼承類的執行結果

在使用Thread繼承類的方法時,建立兩個執行緒,各自執行,資料並不共享,各自執行20次迴圈。