在Java的多線程概念中,start()和run()是兩個最重要的方法。下麵是Thread.start()和Thread.run()方法之間的一些區別:
- 新線程創建:當程序調用start()方法時,將創建一個新線程,然後執行run()方法。但是,如果我們直接調用run()方法,則不會創建新線程,並且run()方法將作為對當前調用線程本身的常規方法調用執行,並且不會發生多線程。讓我們通過一個例子來理解它:
class MyThread extends Thread { public void run() { System.out.println("Current thread name:" + Thread.currentThread().getName()); System.out.println("run() method called"); } } class GeeksforGeeks { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); } }
輸出:
Current thread name:Thread-0 run() method called
從上麵的示例中可以看到,當我們調用線程類實例的start()方法時,將使用默認名稱Thread-0創建一個新線程,然後調用run()方法,並且其中的所有內容都在新創建的線程上執行。現在,讓我們嘗試直接調用run()方法,而不是start()方法:
class MyThread extends Thread { public void run() { System.out.println("Current thread name:" + Thread.currentThread().getName()); System.out.println("run() method called"); } } class GeeksforGeeks { public static void main(String[] args) { MyThread t = new MyThread(); t.run(); } }
輸出:Current thread name:main run() method called
從上麵的示例中可以看到,當我們調用MyThread類的run()方法時,不會創建任何新線程,並且run()方法將在當前線程(即主線程)上執行。因此,沒有發生多線程。 run()方法被稱為常規函數調用。
- 多次調用:在Java的多線程概念中,start()方法和run()方法之間的另一個最重要的區別是,我們不能兩次調用start()方法,否則它將引發IllegalStateException,而run()方法可以多次調用,因為它隻是一種常規方法。讓我們通過一個例子來理解它:
class MyThread extends Thread { public void run() { System.out.println("Current thread name:" + Thread.currentThread().getName()); System.out.println("run() method called"); } } class GeeksforGeeks { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); t.start(); } }
輸出:
Current thread name:Thread-0 run() method called Exception in thread "main" java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:708) at GeeksforGeeks.main(File.java:11)
如上例所示,再次調用start()方法將引發java.lang.IllegalThreadStateException。現在,讓我們嘗試兩次調用run()方法:
class MyThread extends Thread { public void run() { System.out.println("Current thread name:" + Thread.currentThread().getName()); System.out.println("run() method called"); } } class GeeksforGeeks { public static void main(String[] args) { MyThread t = new MyThread(); t.run(); t.run(); } }
輸出:Current thread name:main run() method called Current thread name:main run() method called
如上例所示,兩次調用run()方法不會引發任何異常,它會按預期執行兩次,但在主線程本身上執行。
摘要 start() run() 創建一個新線程,並在新創建的線程上執行run()方法。 沒有創建新線程,並且在調用線程本身上執行了run()方法。 不能被多次調用,否則拋出java.lang.IllegalStateException 可以多次調用 在java.lang.Thread類中定義。 在java.lang.Runnable接口中定義,必須在實現類中重寫。
相關用法
- Java super()和this()的區別用法及代碼示例
- Java throw和throws的區別用法及代碼示例
- Java LinkedList和LinkedHashSet的區別用法及代碼示例
- Java ArrayList和HashSet的區別用法及代碼示例
注:本文由純淨天空篩選整理自raman_257大神的英文原創作品 Difference between Thread.start() and Thread.run() in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。