首頁 > 軟體

Java中Thread和Runnable建立執行緒的方式對比

2022-07-04 14:00:47

一、通過繼承Thread建立執行緒

通過繼承Thread類,建立一個執行緒,在主執行緒中,呼叫start,讓執行緒處於runnable狀態,讓系統去執行執行緒的方法。

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("執行執行緒");
    }
}
public class ThreadTest {

    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();
    }
}

二、實現Runnable建立檢查

通過實現runnable介面,建立一個執行緒,需要把runnable的實現類,作為Thread的構造方法的引數,執行這個執行緒。

public class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println("執行執行緒");
    }
}

public class ThreadTest {
    public static void main(String[] args) {
        Runnable thread = new MyThread();
        Thread thread1 = new Thread(thread);
        thread1.start();

    }
}

這裡要注意一些,runnable的實現類,是沒有start()方法的,只有run()方法

如果執行這個run方法,依然能執行執行緒的方法,但是,這個方法並不是在新的執行緒中執行的,而是在主執行緒中執行的。

public class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println("此方法在:"+Thread.currentThread().getName()+"中執行");
    }
}


public class ThreadTest {

    public static void main(String[] args) {
        Runnable run = new MyThread();
        System.out.println("此方法在:"+Thread.currentThread().getName()+"中執行");
        run.run();
//        Thread thread1 = new Thread(run);
//        thread1.start();

    }
}

執行結果:

如果把註釋開啟,run()註釋掉,結果如下:

三、比較兩種建立方式

3.1、多繼承

Java是不支援類的多繼承的,但是支援介面的多實現,所以Runnable在使用上更加靈活。

3.2、 資料共用

如果一個類繼承Thread,則不適合資源共用。但是如果實現了Runable介面的話,則很容易的實現資源共用。
如果執行緒中有一個成員變數,使用Runnable建立的執行緒,多個執行緒之間可以共同存取這個變數,而Thread不可以。

為什麼呢?一個Thread建立的執行緒,每次都是new的一個新的執行緒物件,執行緒物件之間的成員變數不共用。而Runnale,可以作為Thread類的引數,可以多建立幾個Thread類,把Runnale作為引數,讓多個執行緒一起執行。

public class ThreadTest {

    public static void main(String[] args) {
        Runnable run = new MyThread();
        Thread thread1 = new Thread(run);
        Thread thread2 = new Thread(run);
        Thread thread3 = new Thread(run);
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

3.3、執行緒池

執行緒池只能放入實現Runable或callable類執行緒,不能直接放入繼承Thread的類。

四、原始碼分析

當我們進入Thread方法,可以看的Thread也實現了Runnable介面

使用Thread肯定也實現了他的run方法。

可以看出,在這個run方法中,如果target不為空,執行target的run方法,那target是什麼?

進入後,發現是runnable介面,那它是如何初始化的?突然想起,執行runnable的實現類時,都會把他通過建構函式傳遞,那來看看建構函式。

繼續往下,可以看出確實是在這裡初始化的。

所以,Runnbale介面的run方法,是通過Thread的成員變數去執行的。

到此這篇關於Java中Thread和Runnable建立執行緒的方式對比的文章就介紹到這了,更多相關Java中Thread和Runnable建立執行緒內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com