1. 程式人生 > >多執行緒實現的兩種方式及其區別

多執行緒實現的兩種方式及其區別

繼承Thread

public class Demo2_Thread {

    public static void main(String[] args) {
        MyThread mt = new MyThread();
        mt.start();  // 注意呼叫的start()方法,而不是run()方法
        for(int i = 0; i < 1000; ++i)
            System.out.println("222");
    }
}

class MyThread extends Thread{    // 繼承Thread類
@Override public void run() { // 重寫run方法 for(int i = 0; i < 1000; ++i) // 將將要執行的程式碼寫到run方法中 System.out.println("1111111111"); } }

實現Runnable介面

public class Demo3_Thread {

    public static void main(String[] args) {
        new Thread(new MyRunnable()).start();
        for
(int i = 0; i < 1000; ++i) System.out.println("bb"); } } class MyRunnable implements Runnable{ @Override public void run() { for(int i = 0; i < 1000; ++i) System.out.println("aaaaaaaaaaaaaaaaa"); } }

兩種方式的區別

檢視原始碼的區別:
1、繼承Thread:由於子類重寫父類的run(),當呼叫start()時,直接找子類的run()方法
2、實現Runnable介面:Thread的建構函式中傳入了Runnable引用,成員變數記住它,start()呼叫Thread中的run()方法時,判斷成員變數Runnable的引用是否為空,不為空則在Thread的run()方法中呼叫Runnable的run()方法。編譯看Runnable的run(),執行看子類run()方法。
繼承Thread:(首選這個,如果有了父類就用介面)
好處是:直接使用Thread類中的方法,程式碼簡單
弊端是:如果已經有了父類,就不能使用這種方法
實現Runnable介面:
好處是:即使自己定義的執行緒類有了父類也沒有關係,因為有了父類也可以實現介面,而介面是可以多實現的
弊端是:不能直接使用Thread類中的方法,需要先獲取到執行緒物件後,才能得到Thread的方法,程式碼複雜