多线程中的ManualResetEvent
先来看一下简单的多线程控制台程序:
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.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相关推荐
- 【Linux】多线程中使用fork()
(最核心的东西我在下面用红色字体标出来了,理解了那块,这些东西都是就理解了!) 在本篇文章开始之前,需要大家先了解线程和进程,这位大哥讲的言简意赅:进程和线程的主要区别(总结)_kuangsongha ...
- java闭合数据_java多线程中线程封闭详解
线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...
- java多线程中的join方法详解
java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...
- 了解多线程中的yield
2019独角兽企业重金招聘Python工程师标准>>> 最近在学习多线程这一块,发现里面有好多让人产生误区的地方,今天我来分析下java多线程中的yield功能,希望其他朋友也可以从 ...
- 解决DataGridView在多线程中无法显示滚动条的问题
解决DataGridView在多线程中无法显示滚动条的问题 参考文章: (1)解决DataGridView在多线程中无法显示滚动条的问题 (2)https://www.cnblogs.com/roph ...
- VMware 虚拟化编程(8) — 多线程中的 VixDiskLib
目录 目录 前文列表 多线程注意事项 多线程中的 VixDiskLib 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VMware 虚拟化 ...
- 如何在多线程中调用winform窗体控件2——实例篇
如何在多线程中调用winform窗体控件2--实例篇 针对之前文章<如何在多线程中调用winform窗体控件>,下面举个我项目中的实际案例,这是一个我自定义控件在异步设置焦点时的代码.在新 ...
- android串口补位,Rust多线程中的消息传递机制
代码说话. use std::thread; use std::sync::mpsc; use std::time::Duration; fn main() { let (tx, rx) = mpsc ...
- JAVA多线程中join()方法的详细分析
虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像 ...
最新文章
- IE 中释放javascript对象
- 【转载】C ++ 基础 指针 引用
- 安卓--L2T虚拟连接
- 使用Java EE和OIDC构建Java REST API
- 达芬奇linux 与win,抛弃Linux:达芬奇软件WIN版安装及设置.doc
- 机器学习论文泛读总结
- linux ftp中文乱码方块,Ubuntu下NetBeans中文乱码及方框问题的解决方法
- Hadoop配置项整理(hdfs-site.xml)
- fork函数原型与用法
- 手把手教你写CSS行内样式与内联样式
- Katalon Recorder使用教程—安装
- ESP32开发路程——环境搭建、引脚、烧录、UART、ADC、WS2812、RFID、DAC、FreeRTOS、CJSON
- 华硕P10S-M主板组装服务器-raid配置方法
- 网站判断是否是苹果系统和使用微信浏览器
- 好心情精神心理科医生:如何与青春期的孩子沟通?
- 腾讯cos做文件服务器,将腾讯云COS对象存储挂载至腾讯云服务器实现大硬盘存储...
- 简单的java实现分解质因数。
- Ipad越狱注意事项
- html5圣诞贺卡,用CorelDRAW制作漂亮别致的圣诞贺卡
- 谁告诉你 Flutter 会干掉原生开发?