• C#线程的Join方法


    在.Net中,Join方法主要是用来阻塞调用线程,直到某个线程终止或经过了指定时间为止。Join方法的声明如下:

     public void Join();
     public bool Join(int millisecondsTimeout);
     public bool Join(TimeSpan timeout);

    先看一段简单的代码,再来理解Join方法到底是怎么用的,代码如下:

     static void Main()
            {
                var stopwatch = Stopwatch.StartNew();
                Thread[] array = new Thread[5];
    
                Array.ForEach<Thread>(array, t =>
                    {
                        t = new Thread(new ThreadStart(Run));
                        t.Start();
                        t.Join();
                    });
    
                Console.WriteLine("总共使用时间: {0}", stopwatch.ElapsedMilliseconds);
                Console.Read();
            }
    
            static void Run()
            {
                Thread.Sleep(5000);
            }

          上面的代码执行的结果大概为25秒钟,可以推断线程数组是依次去执行Run()方法的。t.Join()会阻塞执行Main()方法的线程,也就是主线程,直到线程t执行完毕,才会启动下一个线程,继续阻塞主线程,直到线程数组全部执行完毕,主线程才会继续执行,最后输出总共使用时间。

      下面我们稍稍改动代码,来验证推断,修改后的代码如下:

     static void Main()
            {
                var stopwatch = Stopwatch.StartNew();
                Thread[] array = new Thread[5];
                int i = 0;
                Array.ForEach<Thread>(array, t =>
                    {
                        t = new Thread(new ThreadStart(Run));
                        i++;
                        t.Name = "线程" + i.ToString();
                        t.Start();
                        t.Join();
                    });
    
                Console.WriteLine("总共使用时间: {0}", stopwatch.ElapsedMilliseconds);
                Console.Read();
            }
    
            static void Run()
            {
                Thread.Sleep(5000);
                Console.WriteLine("当前线程: {0}", Thread.CurrentThread.Name);
            }

          执行的结果每隔5秒,依次输出当前线程的名称,最后输出总共使用时间25033.

          理解了Join()方法,重载版本也就不难理解了。再来看下Join(int millisecondsTimeout)方法,方法摘要为,如果线程已终止,则为 true;如果线程在经过了 millisecondsTimeout 参数指定的时间量后未终止,则为 false。比如上面的代码使用t.Join(1000),只会阻塞主线程1秒。

  • 相关阅读:
    错误需要理由吗?(SQL Server 不存在或访问被拒绝)
    关于权限设计的轻量级实现
    ppc通过数据线与共享电脑上网
    解读.Net中的命名空间和程序集
    .Net XML 树
    软件开发教父与国内高手论道实录全文
    企业信息化, 该怎么规划?
    ASP.NET Portal Starter Kit中的角色验证
    用js实现类似分享到显示效果
    用js实现同一个页面多个渐变效果
  • 原文地址:https://www.cnblogs.com/supperwu/p/2520255.html
Copyright © 2020-2023  润新知