Java Thread 的 run() 與 start() 的區別

來源:互聯網
上載者:User

標籤:參數   機制   imp   時間   bsp   out   比較   suspend   沒有   

下面先簡答的講述一下兩個參數的區別,後續會針對Java線程進行一些補充說明:   1) start:
  用start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。通過調用Thread類的start()方法來啟動一個線程,這時此線程處於就緒(可運行)狀態,並沒有運行,一旦得到cpu時間片,就開始執行run()方法,這裡方法 run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。
2) run:
  run()方法只是類的一個普通方法而已,如果直接調用Run方法,程式中依然只有主線程這一個線程,其程式執行路徑還是只有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。總結:調用start方法方可啟動線程,而run方法只是thread的一個普通方法調用,還是在主線程裡執行。這兩個方法應該都比較熟悉,把需要平行處理的代碼放在run()方法中,start()方法啟動線程將自動調用 run()方法,這是由jvm的記憶體機制規定的。並且run()方法必須是public存取權限,傳回值類型為void。  下面是針對Java線程進行一些補充說明:

Java 的線程是通過java.lang.Thread類來實現的。VM啟動時會有一個由主方法所定義的線程。可以通過建立Thread的執行個體來建立新的線程。每個線程都是通過某個特定Thread對象所對應的方法run()來完成其操作的,方法run()稱為線程體。通過調用Thread類的start()方法來啟動一個線程。

在Java 當中,線程通常都有五種狀態,建立、就緒、運行、阻塞和死亡。
第一是建立狀態。在產生線程對象,並沒有調用該對象的start方法,這是線程處於建立狀態。
第二是就緒狀態。當調用了線程對象的start方法之後,該線程就進入了就緒狀態,但是此時線程發送器還沒有把該線程設定為當前線程,此時處於就緒狀態。線上程運行之後,從等待或者睡眠中回來之後,也會處於就緒狀態。
第三是運行狀態。線程發送器將處於就緒狀態的線程設定為當前線程,此時線程就進入了運行狀態,開始運行run函數當中的代碼。
第四是阻塞狀態。線程正在啟動並執行時候,被暫停,通常是為了等待某個時間的發生(比如說某項資源就緒)之後再繼續運行。sleep,suspend,wait等方法都可以導致線程阻塞。
第五是死亡狀態。如果一個線程的run方法執行結束或者調用stop方法後,該線程就會死亡。對於已經死亡的線程,無法再使用start方法令其進入就緒。

實現並啟動線程有兩種方法
1、寫一個類繼承自Thread類,重寫run方法。用start方法啟動線程
2、寫一個類實現Runnable介面,實現run方法。用new Thread(Runnable target).start()方法來啟動

多線程原理:相當於玩遊戲機,只有一個遊戲機(cpu),可是有很多人要玩,於是,start是排隊!等CPU選中你就是輪到你,你就run(),當CPU的啟動並執行時間片執行完,這個線程就繼續排隊,等待下一次的run()。

調用start()後,線程會被放到等待隊列,等待CPU調度,並不一定要馬上開始執行,只是將這個線程置於可動行狀態。然後通過JVM,線程Thread會調用run()方法,執行本線程的線程體。 先調用start後調用run,這麼麻煩,為了不直接調用run?就是為了實現多線程的優點,沒這個start不行。

1. start()方法來啟動線程,真正實現了多線程運行。這時無需等待run方法體代碼執行完畢,可以直接繼續執行下面的代碼;通過調用Thread類的start()方法來啟動一個線程, 這時此線程是處於就緒狀態, 並沒有運行。 然後通過此Thread類調用方法run()來完成其運行操作的, 這裡方法run()稱為線程體,它包含了要執行的這個線程的內容, Run方法運行結束, 此線程終止。然後CPU再調度其它線程。
2. run()方法當作普通方法的方式調用。程式還是要順序執行,要等待run方法體執行完畢後,才可繼續執行下面的代碼; 程式中只有主線程——這一個線程, 其程式執行路徑還是只有一條, 這樣就沒有達到寫線程的目的。

記住:多線程就是分時利用CPU,宏觀上讓所有線程一起執行 ,也叫並發

public class Test {      public static void main(String[] args) {          Runner1 runner1 = new Runner1();          Runner2 runner2 = new Runner2();  //      Thread(Runnable target) 分配新的 Thread 對象。          Thread thread1 = new Thread(runner1);          Thread thread2 = new Thread(runner2);  //      thread1.start();  //      thread2.start();          thread1.run();          thread2.run();      }  }    class Runner1 implements Runnable { // 實現了Runnable介面,jdk就知道這個類是一個線程      public void run() {          for (int i = 0; i < 100; i++) {              System.out.println("進入Runner1運行狀態——————————" + i);          }      }  }    class Runner2 implements Runnable { // 實現了Runnable介面,jdk就知道這個類是一個線程      public void run() {          for (int i = 0; i < 100; i++) {              System.out.println("進入Runner2運行狀態==========" + i);          }      }  }

 

  

Java Thread 的 run() 與 start() 的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.