当主程序启动时,首先创建ManualResetEventSlim 类的一个实例。然后启动三个线程,等待事件信号通知它们继续执行。

 /// <summary>
/// 创建 ManualResetEventSlim 实例
/// </summary>
private static ManualResetEventSlim _mainEvent = new ManualResetEventSlim(false); /// <summary>
/// 接收信号继续执行
/// </summary>
/// <param name="threadName">线程名</param>
/// <param name="secods">时间(秒)</param>
public void TravelThroughGates(string threadName, int secods)
{
// threadName falls to sleep
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(secods)); // threadName waits for the gates to open
_mainEvent.Wait(); // 阻止当前线程,直到接收到信号 // threadName enters the gates
Console.WriteLine($"{threadName} 继续执行"); }

线程只有在ManualResetEventSlim 对象发出信号才能继续执行,不然只有继续等待,直到接接收到信号。

 /// <summary>
/// 输出
/// </summary>
public void Print()
{
var t1 = new System.Threading.Thread(() => TravelThroughGates("Thread 1", ));
var t2 = new System.Threading.Thread(() => TravelThroughGates("Thread 2", ));
var t3 = new System.Threading.Thread(() => TravelThroughGates("Thread 3", )); t1.Start();
t2.Start();
t3.Start();
System.Threading.Thread.Sleep(TimeSpan.FromSeconds()); // The gates are now open
_mainEvent.Set(); // 发射信号 System.Threading.Thread.Sleep(TimeSpan.FromSeconds());
_mainEvent.Reset(); // 关闭信号 // The gates have been closed
System.Threading.Thread.Sleep(TimeSpan.FromSeconds()); // The gates are now open for the second time
_mainEvent.Set(); // 发射信号 System.Threading.Thread.Sleep(TimeSpan.FromSeconds()); //The gates have been closed
_mainEvent.Reset(); // 关闭信号
}

线程之间灵活传递信号(ManualResetEventSlim )的更多相关文章

  1. Android消息机制之实现两个不同线程之间相互传递数据相互调用

    目的:实现两个不同线程之间相互传递数据相互调用方法. 线程一中定义mainHandler 并定义一个方法mainDecode 线程二中定义twoHandler 并定义一个方法twoEncode 实现当 ...

  2. 参数在一个线程中各个函数之间互相传递的问题(ThreadLocal)

    ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源. 一个ThreadLocal变量虽然是 ...

  3. 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

    使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...

  4. ThreadLocal父子线程之间的数据传递问题

    一.问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路.然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取 ...

  5. jmeter中线程之间传递参数

    JMeter 变量作用域局限于所属线程.这样设计是经过深思熟虑的,目的是让测试线程能够独立运转.有时候用户可能需要在不同线程间(可能属于同一个线程组,也可能不属于同一个线程组)传递变量. 其中一种方法 ...

  6. Qt 在相同的线程中可以在信号中传递未注册的元对象,在非相同线程中则不能传递未测试的对象,为什么呢?

    有兄台知道可以在留言告诉我,万分感谢!!! 需求:需要在多线程中传递未注册的非元对象数据,时间紧急,无法及时更改该传递的数据为元对象,非继承 QObject 这里采用指针方式传递,同时把传递的局部变量 ...

  7. VC中利用多线程技术实现线程之间的通信

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

  8. [转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

    Linux系统进程的知识总结,进程与线程之间的纠葛... https://cloud.tencent.com/developer/article/1500509 当一个程序开始执行后,在开始执行到执行 ...

  9. Linux系统进程的知识总结,进程与线程之间的纠葛...

    来源:嵌入式ARM 当一个程序开始执行后,在开始执行到执行完毕退出这段时间内,它在内存中的部分就叫称作一个进程. Linux 是一个多任务的操作系统,也就是说,在同一时间内,可以有多个进程同时执行.我 ...

随机推荐

  1. Linux磁盘分区/格式化/挂载目录

    分区及挂载目录 以CentOS7.2为例,一般我们服务端应用部署前需要确认部署机的磁盘空间及挂载目录.操作如下: 如上图,如果操作系统是新装的,未挂盘的话需要先挂载盘.操作如下: fdisk -l # ...

  2. springboot访问服务器本地静态文件的方法

    一.继承WebMvcConfigurerAdapter,重写addResourceHandlers,在registry里面配置访问路径和映射到的服务器本地路径. import org.springfr ...

  3. CentOS7 配置 SSH监听多个端口方法

    一.修改ssh默认端口,防止暴力破解,让系统安全多一点点: i. 在配置文件/etc/ssh/sshd_config文件中修改 Port #AddressFamily any #ListenAddre ...

  4. 远程唤醒、WOL、Magic_Packet【转】

    转自:https://www.cnblogs.com/zhuimengle/p/5898830.html 原文:http://blog.csdn.net/flyoxs/article/details/ ...

  5. 磁盘I/O 监控 iostat

    iostat -cdxm 2 5 dm-4 如果没有这个命令,需要安装sysstat 包. Usage: iostat [ options ] [ <interval> [ <cou ...

  6. dga model train and test code

    # _*_coding:UTF-8_*_ import operator import tldextract import random import pickle import os import ...

  7. 201871010109-胡欢欢《面向对象程序设计(java)》第十周学习总结

    201871010109-胡欢欢<面向对象程序设计(java)>第十周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu- ...

  8. HTTPS各版本安全策略HTTPS1_1_TLS1_0、HTTPS2_TLS1_0、HTTPS2_TLS1_2

    来自阿里云 https://help.aliyun.com/document_detail/115169.html HTTPS安全策略 更新时间:2019-04-26 14:49:12      分组 ...

  9. 【java】@SuppressWarnings

    作用:用于抑制编译器产生警告信息. 示例1——抑制单类型的警告: 示例2——抑制多类型的警告: 示例3——抑制所有类型的警告: 三.注解目标 通过 @SuppressWarnings 的源码可知,其注 ...

  10. 【转】spring的AOP原理,使用场景是什么?

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...