2013-12-10 100 views
4

我有一個類「TestRunnable」,它通過執行Runnable來覆蓋運行方法。 覆蓋運行所運行的方法,如下:如果我們直接調用run方法會發生什麼?

TestRunnable nr = new TestRunnable(); 
Thread t = new Thread(nr); 
t.setName("Fred"); 
t.start(); 
  • 如果我直接調用什麼t.run();
  • ,會發生什麼,如果我們不叫t.start();
+4

爲什麼不試一試? –

回答

8

run方法只是另一種方法。如果直接調用它,則它不會在另一個線程中執行,而會在當前線程中執行。

這裏是我的測試TestRunnable

class TestRunnable implements Runnable 
{ 
    public void run() 
    { 
     System.out.println("TestRunnable in " + Thread.currentThread().getName()); 
    } 
} 

輸出如果只start被稱爲:

TestRunnable in Fred 

輸出如果只run被稱爲:

TestRunnable in main 

如果start不叫,然後創建的永遠不會運行。主線程結束並且Thread將被垃圾收集。

輸出如果沒有被稱爲:(無)

+0

這是因爲他改變了問題... – user949300

+0

看起來你已經覆蓋了它,現在將刪除我非常相似的答案。 – user949300

+0

開始爲新線程創建單獨的調用堆棧,然後運行()由JVM調用 – Kaushal28

0

如果調用start方法,然後一個單獨的線程將被分配給執行run方法,意味着你實現多線程。但是當你直接調用run方法時,它變成了一個普通的方法,而main方法本身將執行run方法,這意味着沒有多線程。

相關問題