2011-04-11 65 views
1

我有下面的代碼,有誰可以請澄清我的疑問。重新實例化線程

public static void Main() { 
    Thread thread = new Thread(Display); 
    thread.Start(); 
    Thread.Sleep(5000);  
    // Throws exception, thread is terminated, cannot be restarted. 
    thread.Start() 
} 

public static void Display() { 

} 

這似乎是爲了重新啓動線程我不得不再次實例化線程。這是否意味着我正在創建一個新線程?如果我繼續創建100次重新注入,是否會創建100個線程並導致性能問題?

+0

你可能想排列'Display',以便它被線程池處理而不是手動創建一個線程。 – CodesInChaos 2011-04-11 12:21:03

+0

你究竟在做什麼?通常情況下,通過讓線程保持空閒狀態來阻止線程創建開銷,然後在進行更多工作時再次啓動它們。但是,真的,你的實際問題是什麼? – 2011-04-11 12:21:38

+0

線程和線程之間有區別。在上面的代碼中,您正在啓動線程「線程」兩次。您調用的Sleep方法不會調用您已啓動的線程,但應用程序主線程 – reggie 2011-04-11 12:24:45

回答

3

是的,您必須創建一個新線程或每次將任務提供給線程池以避免創建真正的新線程。您無法重新啓動線程。

但是,我建議如果您的任務未能連續執行100次,您的問題比啓動新任務的性能開銷更大。

+0

好的,謝謝約翰。如果我想多次執行相同的方法,我需要一次又一次地將它添加到線程池隊列中? – Lamps 2011-04-11 12:34:32

+0

@Bharskar:或者只是改變結構,以便在*線程內循環*直到它工作...有一個方法可以從同一個新線程多次調用Display,而不是每個* *調用的新線程。 – 2011-04-11 12:57:56

1

您不需要在sleep之後啓動線程,線程會自動喚醒。這是相同的線程。

1

首先,如果線程已經啓動,則無法啓動該線程。在你的例子中,線程完成了工作,這就是爲什麼它處於終止狀態。

您可以使用檢查狀態: Thread.ThreadState

1

你們是不是在完成前5秒喚醒線程呢?在這種情況下,你可以嘗試使用監視器(等待,脈衝等)

+0

是的,我想執行很多次。 – Lamps 2011-04-11 12:35:34