我有一個類「TestRunnable」,它通過執行Runnable
來覆蓋運行方法。 覆蓋運行所運行的方法,如下:如果我們直接調用run方法會發生什麼?
TestRunnable nr = new TestRunnable();
Thread t = new Thread(nr);
t.setName("Fred");
t.start();
- 如果我直接調用什麼
t.run();
- ,會發生什麼,如果我們不叫
t.start();
?
我有一個類「TestRunnable」,它通過執行Runnable
來覆蓋運行方法。 覆蓋運行所運行的方法,如下:如果我們直接調用run方法會發生什麼?
TestRunnable nr = new TestRunnable();
Thread t = new Thread(nr);
t.setName("Fred");
t.start();
t.run();
t.start();
?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
將被垃圾收集。
輸出如果沒有被稱爲:(無)
這是因爲他改變了問題... – user949300
看起來你已經覆蓋了它,現在將刪除我非常相似的答案。 – user949300
開始爲新線程創建單獨的調用堆棧,然後運行()由JVM調用 – Kaushal28
如果調用start方法,然後一個單獨的線程將被分配給執行run方法,意味着你實現多線程。但是當你直接調用run方法時,它變成了一個普通的方法,而main方法本身將執行run方法,這意味着沒有多線程。
爲什麼不試一試? –