1. 程式人生 > >關於執行緒的run()、start()、join()方法

關於執行緒的run()、start()、join()方法

一、run()和start()

run:run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼,這樣就沒有達到寫執行緒的目的。

start:用start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體程式碼執行完畢而直接繼續執行下面的程式碼。通過呼叫Thread類的start()方法來啟動一個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到cpu時間片,就開始執行run()方法,這裡方法 run()稱為執行緒體,它包含了要執行的這個執行緒的內容,Run方法執行結束,此執行緒隨即終止。

總結:呼叫start方法方可啟動執行緒,而run方法只是thread的一個普通方法呼叫,還是在主執行緒裡執行。這兩個方法應該都比較熟悉,把需要並行處理的程式碼放在run()方法中,start()方法啟動執行緒將自動呼叫 run()方法,這是由jvm的記憶體機制規定的。並且run()方法必須是public訪問許可權,返回值型別為void。


下面這道題的輸出結果,可以區分run和start方法:

public class Main {

    public static void main(String args[]) {
        Thread t = new Thread() {
        public void run() {
        pong();
        }
        }; 
        t.run();
        
        System.out.println("ping");
        }
        static void pong() {
        System.out.println("pong");
        }
}

注意t呼叫的方法。通過上網查資料和實際演示,總結如下:

如果是t.run(),執行很多次,結果都是pong ping。後來終於發現了關鍵點所在,執行緒物件t,呼叫的不是start()方法,而是run()方法。後來開斷點模式debug,發現呼叫run()方法,整個程式只有一個執行緒,而呼叫start()方法之後,程式就會多出一個執行緒。這時才有和主執行緒爭cpu,可能出現多種結果的情況,但由於下面輸出方法很快就被執行了,所以基本上都是“ping pong”的輸出。

所以run()和start()的區別就是:
run()是Runnable介面中定義的一個方法,是為了讓客戶程式設計師在這個方法裡寫自己的功能程式碼的。直接呼叫和普通的類呼叫自己的成員方法是沒有任何區別的。
而start()則是執行緒開始執行的標誌,當這個方法被呼叫後,程式中才會多出一個獨立的執行緒,接著便是執行run()方法。


二、join()

join是Thread類的一個方法,啟動執行緒後直接呼叫,例如:

Thread t = new AThread(); t.start(); t.join();

用途:在很多情況下,主執行緒生成並起動了子執行緒,如果子執行緒裡要進行大量的耗時的運算,主執行緒往往將於子執行緒之前結束,但是如果主執行緒處理完其他的事務後,需要用到子執行緒的處理結果,也就是主執行緒需要等待子執行緒執行完成之後再結束,這個時候就要用到join()方法了。