java中Thread的start()與run()的區別

start()方法來啓動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。

通過調用Thread類的start()方法來啓動一個線程,這時此線程是處於就緒狀態,並沒有運行。然後通過此Thread類調用方法run()來完成其運行操作的,這裏方法run()稱爲線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程終止,而CPU再運行其它線程,

run()方法當作普通方法的方式調用,程序還是要順序執行,還是要等待run方法體執行完畢後纔可繼續執行下面的代碼。

而如果直接用Run方法,這只是調用一個方法而已,程序中依然只有主線程--這一個線程,其程序執行路徑還是隻有一條,這樣就沒有達到寫線程的目的。

示例:

<span style="font-family:Times New Roman;font-size:18px;color:#006600;">public class TestThread1 {
     public static void main(String[]args) {
          Runner1 r=new Runner1();
          //這是方法調用,而不是開啓一個線程
          //r.run();
          //調用了Thread(Runnable target)方法。且父類對象變量指向子類對象。
          Thread t=new Thread(r);
          t.start();
          for(int i=0;i<100;i++) {
                System.out.println("進入Main Thread運行狀態");
                System.out.println(i);
          }
     }
}
 
//實現了這個接口,jdk就知道這個類是一個線程
class Runner1 implements Runnable {
     public void run() {
          for(int i=0;i<100;i++) {
                System.out.println("進入Runner1運行狀態");
                System.out.println(i);
          }
     }
}</span>


Thread對象的run()方法在一種循環下,使線程一直運行,直到不滿足條件爲止,在你的main()裏創建並運行了一些線程,調用Thread類的start()方法將爲線程執行特殊的初始化的過程,來配置線程,然後由線程執行機制調用run()。如果你不調用start()線程就不會啓動。

因爲線程調度機制的行爲是不確定的,所以每次運行該程序都會有不同的結果,你可以把你的循環次數增多些,然後看看執行的結果,你會發現main()的線程和Thread t是交替運行的。

還有就是儘管線程的調度順序是不固定的,但是如果有很多線程被阻塞等待運行,調度程序將會讓優先級高的線程先執行,而優先級低的線程執行的頻率會低一些。

線程的啓動是比較複雜的,需要爲線程分配資源,它的START方法被調用時系統纔會爲線程分配資源。你上面調用線程的run方法只能算普通的方法調用一樣,得運行完run裏面的代碼整個程序才能往下進行,而如果調用start方法,線程和MAIN方法就會搶資源,打印的語句會交替出現。

以上內容整理自互聯網

發佈了8 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章