• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 深入多线程之:解析线程的交会(Thread Rendezvous)详解

深入多线程之:解析线程的交会(Thread Rendezvous)详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了rendezvous,rendezvous是什么意思,罪之光rendezvous,lr rendezvous,罪之光rendezvous攻略等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在上篇文章中我们使用了Wait和Pulse 实现了Countdown

接下来我们可以使用刚刚写的Countdown 类来实现两个线程的交会。

        public static void MainThread()
        {
            Random r = new Random();
            new Thread(Mate).Start(r.Next(1000));
            Thread.Sleep(r.Next(10000)); //主线程睡眠一段时间

            _countdown.Singnal(); //向_countdown注册信号,告知主线程已经来了。
            _countdown.Wait();    //等待其他线程

            Console.WriteLine("Mate!");
        }

        static void Mate(object delay)
        {
            Thread.Sleep((int)delay);//线程睡眠。

            _countdown.Singnal(); //向_countdown注册信号,告知线程已经来了。
            _countdown.Wait();   //等待其他线程。

            Console.WriteLine("Mate!");

        }
}
</div>
就像小时候去春游一样,这里的_countdown就是老师,线程就是学生。

学生A早上睡觉,然后起床来到交会点,然后告诉老师,我来了,接着等待老师的出发命令,因为老师知道有两个学生要去春游,所以现在只来了一个,还有一个没有来,所以老师会让学生A等待,阻塞。

学生B也是睡觉,接着也来到交会点,告诉老师,我也来了,然后等待老师的出发命令。

当学生B告诉老师我来了的时候,此时老师的剩余等待学生计数为0,所以老师告诉这两个学生,你们可以出发了。

.net framework 4.0 提供了Barrier 的构造来实现线程交会的功能。如图所示:

Thread1 调用SignalAndWait告知Barrier,我已经来了,然后阻塞。

Thread3调用SignalAndWait告知Barrier,我已经来了,然后阻塞。

Thread2 调用SignalAndWait告知Barrier,我已经来了,Barrier知道现在三个线程都来了,所以让他们继续并发执行。

Barrier的方法简介:

    AddParticipants:增加参与者,也就是增加春游的人数。
    RemoveParticipant:减少参与者,可能某人肚子痛,不能参加春游了。
    SignalAndWait :参与者已经来了,并等待其他参与者的到来。

下面是使用Barrier的示例:

        public static void Main()
        {
            new Thread(Speak).Start();
            new Thread(Speak).Start();
            new Thread(Speak).Start();
        }

        static void Speak()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.Write(i + " ");
                _barrier.SignalAndWait(); //告知参与者已经来了,等待其他参与者
            }
        }
</div>
输出如下:

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4

Barrier 的另一个非常有用的特性是在每一个阶段完成的时候你都可以执行一个post-phase 的action委托。

什么是阶段呢??,阶段就是参与者全部都到了的时候。

如果我们修改Barrier的构造函数如下:

static Barrier _barrier = new Barrier(3, (barrier) => Console.WriteLine());

//说明有三个参与者,并且每次三个参与者完成任务的时候执行Console.WriteLine方法.

那么我们的输出如下所示:

0 0 0

1 1 1

2 2 2

3 3 3

4 4 4

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入多线程之:解析线程的交会(Thread Rendezvous)详解

相关文章

  • 2017-05-28C#中的DataSet、string、DataTable、对象转换成Json的实现代码
  • 2017-05-28C# 类的声明详解
  • 2017-05-28在Unity中实现动画的正反播放代码
  • 2017-05-28C#之Socket操作类实例解析
  • 2017-05-28C#使用round函数四舍五入的方法
  • 2017-05-28C#利用ScriptControl动态执行JS和VBS脚本
  • 2017-05-28C#实现解析百度天气数据,Rss解析百度新闻以及根据IP获取所在城市的方法
  • 2017-05-28DevExpress实现TreeList按条件隐藏节点CheckBox的方法
  • 2017-05-28C#利用XML创建Excel文档的实现方法
  • 2017-05-28你是不是这样写异常处理代码的呢?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现多线程的Web代理服务器实例
    • 谈谈C# replace在正则表达式中的意义
    • C# DataTable 转换为 实体类对象实例
    • c#创建windows服务入门教程实例
    • C#调用SQLite的方法实例分析
    • C#简单实现子窗体向父窗体传值的方法
    • C#解码base64编码二进制数据的方法
    • C#检测是否有u盘插入的方法
    • C#实现图形路径变换的方法
    • 下载软件后使用c#获取文件的md5码示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有