`
winzenghua
  • 浏览: 1317401 次
  • 性别: Icon_minigender_2
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

C#中的Thread类的Join()方法

阅读更多

刚接触多线程时,弄不明白Join()的作用,查阅了三本书,都不明不白。后来经过自己的一番试验,终于弄清了Join()的本质。大家看看我这种写法是否易懂,是否真的写出了Join()的本质,多提宝贵意见。]

  Thread类的Join()方法能够将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,线程A将插入线程B之前,直到线程A执行完毕后,才会继续执行线程B。

  试一试:线程的插入

  //《C#初学课堂》
    //注意添加命名空间
    using System.Threading;
  
    static void Main(string[] args)
    {
      //线程A
      Thread ThreadA = new Thread(delegate()
      {
        for (int i = 0; i <= 100000000; i++)
        {
          if (i % 1000000 == 0)
          {
            Console.Write('A');
          }
        }
      });
  
      //线程B
      Thread ThreadB = new Thread(delegate()
      {       
        for (int i = 0; i <= 50000000; i++)
        {
          if (i % 1000000 == 0)
          {
            Console.Write('B');
          }
        }
  
        //在这里插入线程A
        ThreadA.Join();
  
        for (int i = 0; i <= 50000000; i++)
        {
          if (i % 1000000 == 0)
          {
            Console.Write('b');
          }
        }
      });
  
      //启动线程
      ThreadA.Start();
      ThreadB.Start();
    }

  运行结果如下,你能分析清楚为什么吗?

  由运行结果可以看出,一开始两个线程交替进行,当线程B执行到语句“ThreadA.Join()”时,线程A被插入到线程B之前,两个线程合并到一起,变为顺序执行,直到执行完线程A中的所有语句,才去执行线程B中剩余的语句。

  换句话说,当我们在线程B中调用ThreadA.Join()时,该方法只有在线程ThreadA执行完毕之后才会返回。Join()函数还可以接受一个表示毫秒数的参数,当达到指定时间后,如果线程A还没运行完毕,那么Join函数将返回,这时线程A和线程B再次处于交替运行状态中。

分享到:
评论

相关推荐

    关于C#中Thread.Join()的一点理解

    是第一次在C#中接触Thread,自己研究了一下其中Thread.Join()这个方法,下面谈谈自己的理解。  Thread.Join()在MSDN中的解释很模糊:Blocks the calling thread until a thread terminates  有两个主要问题: ...

    C#多线程之Thread中Thread.Join()函数用法分析

    本文实例讲述了C#多线程之Thread中Thread.Join()函数用法。分享给大家供大家参考。具体分析如下: Thread.Join()在MSDN中的解释:Blocks the calling thread until a thread terminates 当NewThread调用Join方法的...

    C# ThreadPool和join最基本操作示例

    通过线程池,可以直接从池中查找出空闲线程,让它执行委托WaitCallback对应函数来执行相关操作。使用时要与AutoResetEvent来并用,以在线程结束时通知主线程退出; 使用线程池来找到一个线程执行函数,实质减少了...

    C#全能速查宝典

    1.2 数学方法类——Math 25 1.2.1 Abs方法——返回指定数字的绝对值 25 1.2.2 Acos方法——返回余弦值为指定数字的角度 26 1.2.3 Asin方法——返回正弦值为指定数字的角度 26 1.2.4 Atan方法——返回正切值为指定...

    NET多线程同步方法详解

    本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入主题,在多线程开发的应用中,线程同步是不可避免的。在.Net框架中,实现线程同步主要通过以下的几种方式来实现,在MSDN的...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    11.5.1 在C# 4.0中使用out类型参数修饰符允许协变性 331 11.5.2 在C# 4.0中使用in类型参数修饰符允许逆变性 332 11.5.3 数组对不安全协变性的支持 335 11.6 泛型的内部机制 335 11.6.1 基于值...

    EZ-USB 例程(C#)

    if (!bRunning) { value = Convert.ToInt32(StartValBox.Text); outCount = 0; inCount = 0; bRunning = true;... StartBtn.Text = "Stop";... //creates new thread ... tXfers.Join(); tXfers = null; } }

    C#多线程中的异常处理操作示例

    本文实例讲述了C#多线程中的异常处理操作。分享给大家供大家参考,具体如下: 常规Thread中处理异常 使用Thread创建的子线程,需要在委托中捕捉,无法在上下文线程中捕捉 static void Main(string[] args) { Thread...

    c# 多线程技术资料合集

    c# 多线程技术资料合集 含部分代码; 包含:多线程Thread类的Join()思路;多线程C#多线程学习;多线程互斥C#多线程学习等等.....

    C#实现的声音录制回放的小程序

    m_Thread.Join(); m_FillProc = null; FreeBuffers(); if (m_WaveOut != IntPtr.Zero) WaveNative.waveOutClose(m_WaveOut); } finally { m_Thread = null; m_Wave...

    多线程实验_1

    C#多线程实验,就AutoResetEvent,ManualResetEvent,Thread.join(),委托多线程回调。

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

Global site tag (gtag.js) - Google Analytics