Java線程啟動為什麼要用start()而不是run()?
1、直接調用線程的run()方法
public class TestStart { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(){ @Override public void run() { System.out.println("Thread t1 is working..."+System.currentTimeMillis()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }; t1.run(); Thread.sleep(2000); System.out.println("Thread Main is doing other thing..."+System.currentTimeMillis()); } }
可以看到主線程在t1.run()
運行之後再過三秒才繼續運行,也就是說,直接在主方法中調用線程的run()
方法,並不會開啟一個線程去執行run()
方法體內的內容,而是同步執行。
2、調用線程的start()方法
public class TestStart { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(){ @Override public void run() { System.out.println("Thread t1 is working..."+System.currentTimeMillis()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }; t1.start(); Thread.sleep(2000); System.out.println("Thread Main is doing other thing..."+System.currentTimeMillis()); } }
startVSrun1.JPG
可以看到在,在執行完t1.start()
這一行之後,主線程立馬繼續往下執行,休眠2s後輸出內容。 也就是說,t1線程和主線程是異步執行的,主線程在線程t1的start()
方法執行完成後繼續執行後面的內容,無需等待run()方法體的內容執行完成。
3、總結
- 1、開啟一個線程必須通過
start()
方法,直接調用run()
方法並不會創建線程,而是同步執行run()
方法中的內容。 - 2、如果通過傳入一個
Runnable
對象創建線程,線程會執行Runnable
對象的run()
方法;否則執行自己本身的run()方法。 - 3、不管是實現
Runnable
接口還是繼承Thread對象,都可以重寫run()方法,達到執行設定的任務的效果。
到此這篇關於線程啟動為什麼要用start()而不是run()?的文章就介紹到這瞭,更多相關start()與run()內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 一篇文章掌握Java Thread的類及其常見方法
- Java多線程之線程狀態詳解
- Java線程中的常見方法(start方法和run方法)
- 詳解Java 線程中斷
- Java多線程Thread類的使用及註意事項