C# thread的join方法使用解析
阿新 • • 發佈:2019-01-23
在C#中,Thread用的是比較多的,至少在windows form中使用是比較頻繁的。
一說到執行緒,可能馬上就會想到介面和執行緒互動的頭疼事,多執行緒之前資料共享,執行緒非同步等等。這些當然是比較頭疼的,只要有信心 ,慢慢來,相信理解不是難事。
對於Thread中的join方法,主要是用來阻塞當前執行緒,等待子執行緒完成後再進行執行。
也就是其實所謂的執行緒合併。比如說主執行緒派生了子執行緒,如果想讓子執行緒完成之前主執行緒等待,就需要利用join來進行阻塞。
下面來看下具體程式碼:
using System; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication1 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { Thread t =new Thread(new ThreadStart(ShowInfo)); for (int j =0; j <20; j++) { if (j ==10) { t.Start(); //開始執行緒 t.Join(); //阻塞當前執行緒 等待t完成後,再繼續 } else { Console.WriteLine("j="+ j); } } } private void ShowInfo() { for (int i =0; i <10; i++) { Console.WriteLine("i="+ i); } } } }
那麼從上面程式碼可以猜測出開始輸出的是j從0到9,然後由於執行緒阻塞,開始輸出i,從0到9,最後輸出j從11到20,執行結果如下:
但是如果我們不用join方法的時候,會是什麼結果呢?按照猜想,主執行緒和子執行緒將會各自執行各的。也就是在輸出j從0到9後,後面的將是亂序輸出,請看結果:
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
下面再更新一個例子上去,這個比較簡單一些。
當然開始是添加了join的時候:
using System; using System.Windows.Forms; using System.Threading; namespace ThreadJonCAPTwo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public Thread tMain; //主執行緒 private void Form1_Load(object sender, EventArgs e) { CreateMainThread(); } ///<summary> /// 建立主執行緒 ///</summary> private void CreateMainThread() { tMain =new Thread(new ThreadStart(MainThreadDoing)); tMain.Start(); } ///<summary> /// 主執行緒開啟 ///</summary> privatevoid MainThreadDoing() { int totalNum =20; for (int i =1; i <= totalNum; i++) { Console.WriteLine("我是店主,我賣了"+ i +"條魚"); if (i ==12) { CreateChildThread(); } } } ///<summary> /// 建立子執行緒 ///</summary> private void CreateChildThread() { Thread tChild =new Thread(new ThreadStart(ChildThreadDoing)); tChild.Start(); //開啟執行緒 //tChild.Join(); //阻塞主執行緒 } ///<summary> /// 子執行緒開啟 ///</summary> private void ChildThreadDoing() { int childNum =20; for (int i =1; i <= childNum; i++) { Console.WriteLine("顧客"+ i +"來買魚啦,呵呵...."); } } } }
得到的結果如下:
但是如果去掉join方法,就會出現下面的結果:
可以看出join結果的作用了吧。目的就是讓主執行緒阻塞,執行主執行緒,子執行緒執行完成,主執行緒再開始,其實本質上說,就是形成一個執行緒來執行。