Java中Thread.start()和Thread.run()的區別。


眾所周知,start()和run()是多執行緒的兩個重要方法,一個用於建立新執行緒,另一個用於啟動該執行緒的執行。

以下是Thread.start()和Thread.run()之間的一些重要區別。

序號關鍵點start()run()
1實現執行緒類的start()方法的實現是:當它被呼叫時,會建立一個新執行緒,並在該新執行緒中執行run()方法內的程式碼。而如果直接執行run()方法,則不會建立新執行緒,run()方法內的程式碼將在當前執行緒中執行,不會發生多執行緒。
2定義start()方法定義在Thread類中,其包為java.lang。run()方法是Runnable介面的方法,也定義在java.lang包中。
3呼叫start()方法不能在同一個物件上呼叫多次,否則會丟擲java.lang.IllegalThreadStateException異常。另一方面,run()方法如果被多次呼叫不會丟擲任何型別的異常。因此,run()方法可以多次呼叫。
4執行緒數量如前所述,呼叫start()方法時,除了當前執行緒外還會建立一個新執行緒,因此至少存在兩個執行緒,從而引入了多執行緒。另一方面,直接呼叫run()方法不會建立新執行緒,任務將在相同的當前執行緒上執行,因此只有一個執行緒,不會引入多執行緒。
5呼叫方式由於Thread類實現了Runnable介面,因此它也實現了run()方法,start()方法在建立新執行緒後內部呼叫run()方法。另一方面,如果我們實現Runnable介面並呼叫run()方法,則run()方法由start()方法執行或直接呼叫。

Thread.start() vs Thread.run() 示例

JavaTester.java

 線上演示

public class JavaTester extends Thread{
   public void run(){
      System.out.println("Thread is running...");
   }
   public static void main(String args[]){
      JavaTester t1=new JavaTester();
      // this will call run() method
      t1.start();
   }
}

輸出

Thread is running...

示例

JavaTester.java

 線上演示

public class JavaTester implements Runnable{
   public void run(){
      System.out.println("Thread is running...");
   }
   public static void main(String args[]){
      JavaTester m1=new JavaTester();
      Thread t1 =new Thread(m1);
      // this will call run() method
      t1.start();
   }
}

輸出

Thread is running...

更新於:2019年9月18日

6000+ 瀏覽量

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告