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!

推薦閱讀: