2010-03-10 70 views

回答

3

由於run方法包含新線程應執行的代碼。

如果您打電話給run方法,那麼您只需在當前線程上執行它。

調用start啓動新線程,然後在新線程上執行run方法

+0

一個Thread出於好奇:這是怎麼了?爲什麼downvote? – 2010-03-10 10:38:10

6

run方法只是在當前線程中執行線程的任務。從歷史上看,您可以繼承Thread並覆蓋run - 雖然今天首選的機制是通過Thread構造函數Runnable。因此run本身不會執行任何線程 - 它是start,它會創建一個新的「實際」線程(而不僅僅是一個Thread對象),並在啓動時執行run()

1

start()方法告訴JVM它需要創建一個特定於系統的線程。創建系統資源後,它將Runnable對象傳遞給它以執行其run()方法。直接調用run()方法的「線程」與調用對象在同一線程中執行,而不是像預期的那樣在單獨的執行線程中執行。

換句話說,調用run()就像正常的方法調用一樣。而調用start()會告訴線程創建必要的系統資源,然後異步執行run()方法。

編輯:

例如,

僞代碼1:

thread one = new thread(); 
thread two = new thread(); 
one.run(); 
two.run(); 

這使得線程順序運行的,即,two.run();將僅運行後one.run();飾面。


僞碼2:

thread one = new thread(); 
thread two = new thread(); 
one.start(); 
two.start(); 

在這種情況下,兩個線程同時啓動和運行。

start()方法調用run()方法異步(犯規等待任何結果,只是觸發了一個動作),但是當我們調用run(),它運行同步,也就是說,它會等待直到run()完成,然後才進到下一行代碼。

0

in java Thread總是在Stack Memory中創建。當您創建一個新的線程時,它會在堆棧中佔用新的內存。當你調用start()方法它初始化新Stack Memory,當你調用run()方法它同樣Stack Memory 初始化這就是爲什麼我們一直呼籲與start()方法