2016-06-14 14 views
0
 Thread thread1 = new Thread(new ThreadStart(c1.print)); 
     Thread thread2 = new Thread(new ThreadStart(c2.print)); 
     Thread thread3 = new Thread(new ThreadStart(c3.print));  

     thread1.Start(); 
     thread2.Start(); 
     thread3.Start(); 

當我運行上面的代碼時,有時會在線程1和線程2之前打印線程3,即使我指定了thread1來啓動第一個線程。爲什麼會發生?爲什麼線程3在線程1之前啓動,即使我指定線程1在代碼中首先啓動?

+8

對線程的相對執行順序做任何形式的假設都會導致你陷入麻煩。他們可能在單獨的CPU /內核上運行。不要假設。如果您需要以特定順序發生的事情,請使用同步原語來確保發生這種情況。 – spender

+1

簡而言之,這就是多線程的工作原理。調度程序決定每個可用線程何時有機會運行。 –

+0

僅僅因爲您指定它首先啓動,並不意味着它首先被授予訪問CPU的處理時間。 – Draken

回答

2

僅僅因爲您撥打Start並不意味着操作系統有義務在此時啓動線程。它會安排它執行,最終它會得到一個允許它運行的時間片,但是當這將是非常不確定的時候。

另外,操作系統可能會啓動線程,然後決定暫停它,同時調度其他線程。這裏的關鍵點是,如果你在線程之間有一個訂購要求,那麼編寫代碼來完成這種排序,而不是OS調度器。

0

看看this post中的例子。
問題的關鍵在於你可以使用多個線程來分配工作,但你永遠不應該對它們運行的​​順序有所期待。
線程可能會或可能不會按預期順序啓動。如果他們以預期的順序開始,他們可能不會按照預期的順序完全執行或完成。

這個陰險的「問題」是,他們往往不會按照預期的順序執行,導致程序員認爲它正在做他們想做的事。但是偶爾他們不會按照這個順序運行。複製或調試將很困難或不可能。