上面的代 碼雖然在大多數的時候可以正常工作,但卻存在一個隱患,就是如果某個線程, 假設是counter1,在運行後,由於某些原因,其他的線程並未運行,在這種情況 下,在counter1運行完後,仍然可以顯示出“所有任務結束”的提示 信息,但是counter2和counter3還並未運行。為了消除這個隱患,可以將 increment方法從run中移除,將其放到ThreadCounter的構造方法中,在這時, increment方法中的lock也可以去掉了。代碼如:
public ThreadCounter(int ms)
{
this.ms = ms;
increment();
}
運行上面的程序後,將顯示如圖2的結果。
圖2
使用Thread.join方法演示
private static void threadMethod(Object obj)
{
Thread.Sleep(Int32.Parse(obj.ToString()));
Console.WriteLine(obj + "毫秒任務結束");
}
private static void joinAllThread(object obj)
{
Thread[] threads = obj as Thread[];
foreach (Thread t in threads)
t.Join();
Console.WriteLine("所有的線程結束");
}
static void Main(string[] args)
{
Thread thread1 = new Thread(threadMethod);
Thread thread2 = new Thread(threadMethod);
Thread thread3 = new Thread(threadMethod);
thread1.Start(3000);
thread2.Start(5000);
thread3.Start(7000);
Thread joinThread = new Thread(joinAllThread);
joinThread.Start(new Thread[] { thread1, thread2, thread3 });
}
在運行上面 的代碼後,將會得到和圖2同樣的運行結果。上述兩種方法都沒有線程數的限制, 當然,仍然會受到操作系統和硬件資源的限制