2013-04-05 54 views
7

我不明白啓動和運行線程之間的區別,我測試了這兩種方法並輸出相同的結果,首先我使用run()的組合並開始運行線程和他們做了同樣的功能如下:運行和啓動線程之間的區別

public class TestRunAndStart implements Runnable { 
public void run() { 
    System.out.println("running"); 
} 
public static void main(String[] args) { 
    Thread t = new Thread(new TestRunAndStart()); 
    t.run(); 
    t.run(); 
    t.start(); 
} 

}

輸出爲:

running 
running 
running 

然後只見run()方法的的Javadoc表示: If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns所以我試圖用run()方法,而不需要單獨運行的,如下所示:

public class TestRun extends Thread { 
public void run(){ 
    System.out.println("Running Normal Thread"); 
} 
public static void main(String[]args){ 
    TestRun TR=new TestRun(); 
    TR.run(); 
    } 

} 

,它也執行run()方法並打印Running Normal Thread儘管它沒有獨立的Runnable構建!那麼什麼是兩種方法

+0

它不是重複的! – naXa 2015-03-24 11:50:19

+0

但是爲時已晚。但可能對別人有幫助。用「System.out」替換run方法的SOP語句。println(「正在運行的線程...」+ Thread.currentThread()。getName());「然後執行你的程序,你會看到不同的結果:輸出是」正在運行的線程... main running thread ... main 正在運行的線程... Thread-0「 – user320676 2016-08-12 06:47:10

回答

23

Thread.run()之間的主要區別不產生新線程,而Thread.start()做,即Thread.run實際上是同一個線程調用者的上運行,而Thread.start()創建在其上運行任務一個新的線程。

+0

好吧,但我不明白」如果此線程是使用單獨的Runnable運行對象構造的「的含義,TestRun類在我的示例中被認爲是構建時沒有單獨的Runnable – 2013-04-05 19:01:45

+0

@JavaPlayer檢查*** [this](http://stackoverflow.com/questions/262816/when-would-you-call-javas-thread-run-instead-of-thread-start)***張貼您的答案 – 2013-04-05 19:05:52

11

當您致電run時,您只是在當前線程中執行run方法。您的代碼因此不會是多線程的。

如果您致電start,則會啓動一個新線程,並且將在該新線程上執行run方法。

0

在第一個示例中,您直接從主線程調用run()方法,然後通過調用t.start()從單獨的線程調用一次。

在第二種情況下,t.start()創建一個單獨的線程上下文,並從該上下文中調用t.run()。

還包括用於運行的文檔()方法:

如果該線程是使用獨立的Runnable運行對象構造的,然後 該Runnable對象的運行方法被調用;否則,這 方法不執行任何操作,並返回

這是真實的,因爲如果你不重寫run()方法,那麼它將簡單的返回,導致該線程終止。 您已經重寫了Thread對象中的run()方法,因此不會調用重寫的方法(不執行任何操作)。

1

線程在其生命週期中經歷了各個階段。 當您調用start()方法線程進入可運行狀態而不是運行狀態。

然後,調度程序從線程池中等待一條線程執行,並將其放入運行階段。在此線程的實際執行發生。