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...
廣告