因爲共享text
。線程t1可以在線程t1可以打印任何東西之前開始(在後臺)並且文本可以被分配給t2。所以兩者都打印t2。如果事情發生得足夠快,它可能會偶爾打印t1,然後是t2。
因爲一個簡單的例子給出我會給出一個簡單的解決方案(雖然不是太有用):
string text = "t1";
Thread t1 = new Thread(() => Console.WriteLine(text));
t1.Start(); // why do not print 't1'?
t1.Join(); // Wait for thread t1 to finish before continuing
text = "t2";
Thread t2 = new Thread(() => Console.WriteLine(text));
t2.Start(); // print 't2'
所不同的是,你等待的線程T1完成分配text
新值之前執行。我只給這個例子說明如何使用Join來等待一個線程完成。
稍微複雜一點的方法是不使用Lamda表達式。如果您創建一個靜態函數來完成工作,你可以通過一個單一的參數(任何類型的object
)的線程啓動功能:
public static void DoPrint(object data)
{
Console.WriteLine((String)data);
}
static void Main(string[] args)
{
string text = "t1";
Thread t1 = new Thread(DoPrint);
t1.Start(String.Copy(text)); // Pass a copy of text to Thread and start
text = "t2"
Thread t2 = new Thread(DoPrint);
t2.Start(String.Copy(text)); // Pass a copy of text to Thread and start
}
注意我們是如何使文本數據的副本傳遞之前。即使text = "t2"
在線程t1打印之前完成,它也不會影響,因爲副本已通過。有兩個開始線:
t1.Start(text);
t2.Start(text);
然後,我們將有同樣的問題作爲原來的例子出於同樣的原因。文本是一個字符串,字符串是一個Class,因此它們通過引用傳遞。
運行足夠多的時間,它實際上可能會偶爾 – 2014-09-06 06:29:09
而不是downvoting他的問題,只是向他提供一些建議。 – RajeshKannan 2014-09-06 06:33:10