1. 程式人生 > >C# thread的join方法使用解析

C# thread的join方法使用解析

在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結果的作用了吧。目的就是讓主執行緒阻塞,執行主執行緒,子執行緒執行完成,主執行緒再開始,其實本質上說,就是形成一個執行緒來執行。