ThreadJoin函數?
MSDN的解釋:阻塞調用線程,直到某個線程終止時為止。首先明確幾個問題:
1、一個進程由一個或者多個線程組成,線程之間有可能會存在一定的先后關系和互斥關系。多線程編程,首先就是要想辦法劃分線程,減少線程之間的先后關系和互斥關系,這樣才能保證線程之間的獨立性,各自工作,不受影響。Google的MapReduce核心思想就是盡量減少線程之間的先后關系和互斥關系。
2、無論如何地想辦法,線程之間還是會存在一定的先后關系和互斥關系,這時候可以使用Thread.Join方法。
3、一個線程在執行的過程中,可能調用另一個線程,前者可以稱為調用線程,后者成為被調用線程。
4、Thread.Join方法的使用場景:調用線程掛起,等待被調用線程執行完畢后,繼續執行。
5、被調用線程執行Join方法,告訴調用線程,你先暫停,我執行完了,你再執行。從而保證了先后關系。
6、考慮一種有意思的情況:在當前線程內調用Thread.CurrentThread.Join() 會出現什么情況?分析:假設當前線程為A,此時調用線程為A,被調用線程也為A,由于調用線程A暫停,被調用線程A(也就是調用線程A)永遠不會執行完畢,造成死鎖。
好了,前面分析完了,現在來看測試用例吧:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace Test{ class TestThread { private static void ThreadFuncOne() { for (int i = 0; i < 10; i++) { Console.WriteLine(Thread.CurrentThread.Name +" i = " + i); } Console.WriteLine(Thread.CurrentThread.Name + " has finished"); } static void Main(string[] args) { Thread.CurrentThread.Name = "MainThread"; Thread newThread = new Thread(new ThreadStart(TestThread.ThreadFuncOne)); newThread.Name = "NewThread"; for (int j = 0; j < 20; j++) { if (j == 10) { newThread.Start(); newThread.Join(); } else { Console.WriteLine(Thread.CurrentThread.Name + " j = " + j); } } Console.Read(); } }}
下面是測試的結果:
結論:從測試中我們可以很清楚的看到MainThread在NewThread.Join被調用后被阻塞,直到NewThread
執行完畢才繼續執行。