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结果的作用了吧。目的就是让主线程阻塞,运行主线程,子线程运行完成,主线程再开始,其实本质上说,就是形成一个线程来执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值