2010-08-31 29 views
7

如果線程已完成,Thread.Join將返回我們。我們可以使用ThreadState來確定。那麼Thread.Join()和Thread.ThreadState有什麼區別?Thread.Join與Thread.State

我們可以互換使用它們嗎?

+2

while(t.ThreadState!= ThreadState.Stopped)HaltAndCatchFire(); – 2010-08-31 17:35:34

回答

14

加入並手動查看ThreadState的區別在於Join是阻止操作。直到達到超時或目標Thread完成後,該功能纔會返回。檢查ThreadState更像是偷窺操作。

+0

糾正我,如果我錯了,但不是ThreadState也不可靠? – Josh 2010-08-31 17:18:01

+2

Ahh ... from * MSDN:有兩個線程狀態枚舉,System.Threading.ThreadState和System.Diagnostics.ThreadState。線程狀態枚舉僅在少數調試場景中有用。你的代碼不應該使用線程狀態來同步線程的活動。* http://msdn.microsoft.com/en-us/library/system.threading.threadstate.aspx – Josh 2010-08-31 17:22:48

+2

@Josh兩者都是不可靠的,因爲它們只提供關於過去的信息:) – JaredPar 2010-08-31 17:27:43

6

Thread.join等待線程完成。 ThreadState只是給你一個線程的快照,並且無需等待就可以返回。還有一個需要等待的Thread.join變種。 ThreadState和Join是非常不同的,我不認爲兩者可以互換使用。

嘗試做一個測試,你在一個有無限循環的線程上進行兩個調用。

3

當您調用Thread.Join()時,它會阻止調用線程,直到完成具有Join方法的線程。如果它被中止或成功完成,則後面的Join()不會阻塞調用線程。這使您可以擁有10個工作線程和一個主線程,在完成所有10個線程後必須運行該操作。所以你可以在第一個線程上調用Join()。該調用將阻塞主線程,直到第一個工作線程完成。之後,您可以在第二個線程上調用Join(),依此類推,直到線程#10。當你調用Join()時,主線程得到恢復,你可以確定所有10個線程都完成了,主線程可以恢復運行。

例如:

Thread workers[] = new Thread[10]; 

//*** create and start threads *** 

foreach(Thread worker in workers) 
{ 
    worker.Join(); 
} 

//All threads are completed, now this operation can continue... 

在另一方面,Thread.ThreadState只返回thread status(已中止運行,...),而不影響調用線程的狀態(沒有加入這使調用線程在WaitSleepJoin州)。因此,這僅適用於您想檢查線程發生了什麼情況,以便您可以採取特定操作,或者您希望實現您自己的加入機制,等等......

0

Thread.Join將阻止調用線程