對於Thread.Join()方法,MSDN給的定義是:在繼續執行標準的 COM 和 SendMessage 消息泵處理期間,阻塞調用線程,直到某個線程終止爲止。
很不好理解,Join()其實是讓調用該線程的線程等待,只到被調用的線程執行完畢。
如以下代碼說明:
public class Apha
{
public void methThread()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Thread.CurrentThread.Name +": i= " + i);
}
}
}
public class Simple
{
static int Main()
{
Apha apha = new Apha();
Thread.CurrentThread.Name = "Main Thread";
Thread o_thread = new Thread(new ThreadStart(apha.methThread));
o_thread.Name = "Sub Thread";
//o_thread.Name = "Sub Threadq"; //報錯:This property has already been set and cannot be modified.
for (int j = 0; j < 20; j++)
{
if (j == 10)
{
o_thread.Start();
//o_thread.Abort(); //如果此代碼存在,則o_thread不會執行。因爲並不是立即執行.Start()方法。
//o_thread.Start(); //報錯: Thread is running or terminated; it cannot restart.
o_thread.Join();
}
else
{
Console.WriteLine(Thread.CurrentThread.Name + ": j = " + j);
}
}
Console.ReadLine();
return 0;
}
}
代碼中的“o_thread.Join();”要是刪除的話,執行結果如下:即主線程和o_thread會交替執行
代碼中的“o_thread.Join();”要是不刪除的話,執行結果如下:即主線程需等待o_thread線程執行完畢,然後才執行,也就是所說的Join()的作用。
補充:
在上面代碼中有兩處有註釋的地方
1.Thread.CurrentThread.Name只能賦值一次
2.調用o_thread.Start()並不是立即執行。
3.線程一旦終止(Abort()),不能用Start()再啓動,會報錯。
4.Thread.CurrentThreads是靜態屬性。
所謂靜態屬性,就是這個類所有對象所公有的屬性,不管你創建了多少個這個類的實例,但是類的靜態屬性在內存中只有一個。很容易理解CurrentThread爲什麼是靜態的——雖然有多個線程同時存在,但是在某一個時刻,CPU只能執行其中一個。