先来看一下简单的多线程控制台程序:

using System;
using System.Threading;

namespace ManualResetEventStudy
{

class ThreadClass
    {
        static void t1()
        {
            for (int x = 1; x <= 5; x++)
            {
                Thread.Sleep(500);
                Console.WriteLine("t1的x:" + x);
            }
        }

static void t2()
        {
            for (int x = 1; x <= 5; x++)
            {
                Thread.Sleep(500);
                Console.WriteLine("t2的x:" + x);
            }
        }

static void Main(string[] args)
        {
            Thread thrd1 = new Thread(t1);
            thrd1.Start();

Thread thrd2 = new Thread(t2);
            thrd2.Start();

for (int x = 1; x <= 5; x++)
            {
                Thread.Sleep(500);
                Console.WriteLine("主线程中的x:" + x);
            }

Console.Read();
        }       
    }
}

入口方法Main里,创建了二个线程,分别调用方法t1与t2,再加上主线程本身,一并有三个线程,运行后,三个线程都在计数输出,结果类似如下:

t2的x:1
t1的x:1
主线程中的x:1
t2的x:2
t1的x:2
主线程中的x:2
t2的x:3
t1的x:3
主线程中的x:3
t2的x:4
t1的x:4
主线程中的x:4
t2的x:5
t1的x:5
主线程中的x:5

三个线程的顺序,在这段代码中我们是无法控制的,天知道谁先开始/谁先结束,反正都是"并行"处理,完全看CPU当时的心情  :)

问题:如果需求有变化,比如要求在主线程执行到某个特定的位置(或时间点)时,才让其它线程开始介入,该怎么做呢?(这种情况实际中很常见,比如某一项计算的入口参数依赖于另一项计算的结果,再比如我们计算月工资前,得先统计出员工当月考勤情况)

System.Threading命名空间下有一个ManualResetEvent类,可以做到这一点:

using System;
using System.Threading;

namespace ManualResetEventStudy
{

class ThreadClass
    {

static ManualResetEvent mre = new ManualResetEvent(false);

static void t1()
        {
            mre.WaitOne(1000);//等待1秒后,自行启动
            for (int x = 1; x <= 5; x++)
            {
                Thread.Sleep(500);
                Console.WriteLine("t1的x:" + x);
            }
        }

static void t2()
        {
            mre.WaitOne();//一直等待下去,直到有"人"调用mre.set()发出信号为止
            for (int x = 1; x <= 5; x++)
            {
                Thread.Sleep(500);
                Console.WriteLine("t2的x:" + x);
            }
        }

static void Main(string[] args)
        {
            Thread thrd1 = new Thread(t1);
            thrd1.Start();

Thread thrd2 = new Thread(t2);
            thrd2.Start();

for (int x = 1; x <= 5; x++)
            {
                Thread.Sleep(500);
                Console.WriteLine("主线程中的x:" + x);

if (x == 3) 
                {
                    mre.Set();//通知所有等待的线程:“同志们,可以动啦”:)
                }
            }

Console.Read();
        }

}
}

t1方法中,我们用 mre.WaitOne(1000);让调用该方法的线程先等候1秒,t2方法中,我们用mre.WaitOne()无限等候,然后主线程中计数到3的时候,手动调用mre.Set()方法唤醒所有等候中的线程,运行结果类似下面这样:

主线程中的x:1
主线程中的x:2
t1的x:1
主线程中的x:3
t1的x:2
t2的x:1
主线程中的x:4
t1的x:3
主线程中的x:5
t2的x:2
t1的x:4
t2的x:3
t1的x:5
t2的x:4
t2的x:5

多线程中的ManualResetEvent相关推荐

  1. 【Linux】多线程中使用fork()

    (最核心的东西我在下面用红色字体标出来了,理解了那块,这些东西都是就理解了!) 在本篇文章开始之前,需要大家先了解线程和进程,这位大哥讲的言简意赅:进程和线程的主要区别(总结)_kuangsongha ...

  2. java闭合数据_java多线程中线程封闭详解

    线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...

  3. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  4. 了解多线程中的yield

    2019独角兽企业重金招聘Python工程师标准>>> 最近在学习多线程这一块,发现里面有好多让人产生误区的地方,今天我来分析下java多线程中的yield功能,希望其他朋友也可以从 ...

  5. 解决DataGridView在多线程中无法显示滚动条的问题

    解决DataGridView在多线程中无法显示滚动条的问题 参考文章: (1)解决DataGridView在多线程中无法显示滚动条的问题 (2)https://www.cnblogs.com/roph ...

  6. VMware 虚拟化编程(8) — 多线程中的 VixDiskLib

    目录 目录 前文列表 多线程注意事项 多线程中的 VixDiskLib 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VMware 虚拟化 ...

  7. 如何在多线程中调用winform窗体控件2——实例篇

    如何在多线程中调用winform窗体控件2--实例篇 针对之前文章<如何在多线程中调用winform窗体控件>,下面举个我项目中的实际案例,这是一个我自定义控件在异步设置焦点时的代码.在新 ...

  8. android串口补位,Rust多线程中的消息传递机制

    代码说话. use std::thread; use std::sync::mpsc; use std::time::Duration; fn main() { let (tx, rx) = mpsc ...

  9. JAVA多线程中join()方法的详细分析

    虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像 ...

最新文章

  1. IE 中释放javascript对象
  2. 【转载】C ++ 基础 指针 引用
  3. 安卓--L2T虚拟连接
  4. 使用Java EE和OIDC构建Java REST API
  5. 达芬奇linux 与win,抛弃Linux:达芬奇软件WIN版安装及设置.doc
  6. 机器学习论文泛读总结
  7. linux ftp中文乱码方块,Ubuntu下NetBeans中文乱码及方框问题的解决方法
  8. Hadoop配置项整理(hdfs-site.xml)
  9. fork函数原型与用法
  10. 手把手教你写CSS行内样式与内联样式
  11. Katalon Recorder使用教程—安装
  12. ESP32开发路程——环境搭建、引脚、烧录、UART、ADC、WS2812、RFID、DAC、FreeRTOS、CJSON
  13. 华硕P10S-M主板组装服务器-raid配置方法
  14. 网站判断是否是苹果系统和使用微信浏览器
  15. 好心情精神心理科医生:如何与青春期的孩子沟通?
  16. 腾讯cos做文件服务器,将腾讯云COS对象存储挂载至腾讯云服务器实现大硬盘存储...
  17. 简单的java实现分解质因数。
  18. Ipad越狱注意事项
  19. html5圣诞贺卡,用CorelDRAW制作漂亮别致的圣诞贺卡
  20. 谁告诉你 Flutter 会干掉原生开发?

热门文章

  1. 创立一家互联网公司,需要几步?
  2. B端设计指南-表格设计的常见问题
  3. 独家发布 | 产品经理生存现状
  4. 问答专场 | 我是高级商业产品总监吴波,你有什么想问的?
  5. 【python基础】用字典做一个小型的查询数据库
  6. 使用NuGet发布自己的类库包(Library Package)
  7. Android实战处理带+号的电话号码在Arabic语言中的正确显示
  8. ios_随手篇3_关于宏的使用
  9. 自由职业者在合作之前要弄懂的15个问题
  10. U9cloud RPA加持 智领未来