• Thread的join方法使用解析


      在C#中,Thread用的是比较多的,至少在windows form中使用是比较频繁的。一说到线程,可能马上就会想到界面和线程交互的头疼事,多线程之前数据共享,线程异步等等。这些当然是比较头疼的,只要有信心 ,慢慢来,相信理解不是难事。

    对于Thread中的join方法,主要是用来阻塞当前线程,等待子线程完成后再进行运行。也就是其实所谓的线程合并。比如说主线程派生了子线程,如果想让子线程完成之前主线程等待,就需要利用join来进行阻塞。

    下面来看下具体代码:

    using System;
    using System.Windows.Forms;
    using System.Threading;

    namespace WindowsFormsApplication1
    {
    publicpartialclass Form2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    }

    privatevoid 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);
    }
    }
    }

    privatevoid 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
    {
    publicpartialclass Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    public Thread tMain; //主线程

    privatevoid Form1_Load(object sender, EventArgs e)
    {
    CreateMainThread();
    }

    ///<summary>
    /// 创建主线程
    ///</summary>
    privatevoid 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>
    privatevoid CreateChildThread()
    {
    Thread tChild
    =new Thread(new ThreadStart(ChildThreadDoing));
    tChild.Start();
    //开启线程
    //tChild.Join(); //阻塞主线程
    }

    ///<summary>
    /// 子线程开启
    ///</summary>
    privatevoid ChildThreadDoing()
    {
    int childNum =20;
    for (int i =1; i <= childNum; i++)
    {
    Console.WriteLine(
    "顾客"+ i +"来买鱼啦,呵呵....");
    }
    }
    }
    }

    得到的结果如下:

    但是如果去掉join方法,就会出现下面的结果:

    可以看出join结果的作用了吧。目的就是让主线程阻塞,运行主线程,子线程运行完成,主线程再开始,其实本质上说,就是形成一个线程来执行。

  • 相关阅读:
    OPENSSH 详解
    红帽RHEL8和7有什么区别(Centos8与7参照redhat)
    RHEL8和CentOS8怎么重启网络
    Redhat7.x Openssh、Openssl升级
    RHEL7.x更换更换Centos yum源
    NTP时间同步
    2019-12-17:权限维持,笔记
    2019-12-13:提权学习,笔记
    2019-12-11:kali linux工具Msfvenom 命令自动补全
    2019-12-10:win7,win12提权练习
  • 原文地址:https://www.cnblogs.com/scy251147/p/2134219.html
Copyright © 2020-2023  润新知