2012-11-29 39 views
2

這可能是一個基本的問題,我用這個困惑,通過調用start()和run()來運行線程,有什麼不同?

在一個文件中

我有這樣的:

public class MyThread extends Thread { 
    @Override 
    public void run() { 
     //stuffs 
    } 
} 
現在

在另一個文件中,我有這樣的:

public class Test { 
    public static void main(String[] args) { 
     Thread obj = new MyThread(); 

     //now cases where i got confused 
     //case 1 
     obj.start(); //it makes the run() method run 
     //case 2 
     obj.run();  //it is also making run() method run 
    } 
} 

所以在上面兩種情況之間有什麼區別,情況1是創建一個新線程,而情況2是不創建一個線程?這是我的猜測...希望能有更好的回答SO guys.Thanks

+0

有一個不錯的鏈接,涵蓋了線程基礎:http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html –

+0

@ rai.skumar感謝您的鏈接,但這是在concrrency,不是我在這裏問的。 –

+0

你希望什麼「更好的答案」?下面是簡短的答案:start()是庫提供給你的方法,當你想啓動一個線程時,你可以調用它。 run()是_you_提供庫調用的方法,它決定了線程將執行的操作。 –

回答

17

start()在新線程中運行run()中的代碼。在新線程中直接調用run()不會執行run(),而是線程run()被調用。

如果您直接致電run(),則表明您不是線程。直接調用run()將會阻塞,直到run()中的任何代碼完成。 start()創建一個新線程,並且由於run中的代碼正在該新線程中運行,因此start()會立即返回。 (好吧,從技術上講不是立即,而是在創建新線程並將其踢開後完成。)

另外,您應該是implementing runnable, not extending thread

+0

謝謝。 +1並被接受。 –

2

調用start()將創建一個新的執行線程,然後運行()將在新創建的線程中執行

其中直接調用運行()將在當前線程執行代碼

2
  • run()方法在調用start()之後:這是由你創建的線程執行的,它被分配的處理器獨立運行。

  • run()方法由您調用:從您的調用線程執行。

2

簡單回答你的問題是這樣的:

的run():在run()方法運行的代碼,阻塞,直到它完全

start()方法:回報立即(不封鎖)和另一個線程運行run()方法中的代碼

2

調用start開始線程。它的基本工作是創建和啓動新線程,然後在該新線程上調用run

調用run只是在當前線程上調用run方法。您從不直接致電run,請使用start

1

在一行中直接調用run()同步(代碼將阻塞,直到run()的返回),並調用start()(你的代碼不會等待運行完成,因爲它被稱爲在其他線程obj)是異步

當您直接使用start()方法時,則線程將使用您提供給它的Runnable實例運行一次,然後該線程將不可用。

但要充分利用在Java中有內置的線程池和調度能力,延伸Runnable或贖回是要走的路。

1

start()啓動線程。 run()只是在當前線程中運行代碼。

相關問題