AutoResetEvent和ManualResetEvent
本文在于巩固基础
AutoResetEvent
概念:通知正在等待的线程已发生的事件
如果AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。 调用Set 向AutoResetEvent 发信号以释放等待线程。
可以通过构造函数设置事件状态 false为非终止,true为终止
常用方法:
Set();将事件状态设置为终止状态,允许一个或多个等待线程继续。
ReSet();将事件状态设置为非终止状态,导致线程阻止
WaitOne();阻止当前线程,直到当前 WaitHandle 收到信号。
ManualResetEvent用法差不多,有一点差别,在下面可以看到
下面通过一个简单实例来演示这个基本用法
class Program
{
//设置事件状态为非终止 private static ManualResetEvent _manualResetEvent=new ManualResetEvent(false);
private static Thread _thread = new Thread(new ThreadStart(ThreadMethod));
private static int _count = ;
static void Main(string[] args)
{
_thread.Start();
Console.ReadLine();
_manualResetEvent.Set();// 通知等待线程继续 } private static void ThreadMethod()
{
while (true)
{
_manualResetEvent.WaitOne();//由于上面设置事件状态为非终止所以下面语句不会执行,除非收到可以继续的信号
Thread.Sleep();
Console.WriteLine(_count++); }
}
一开始不会有输出,直到你输入数据后线程才会继续
结果如下
W
0
1
2
3
4
5
6
7
8
...
注意这里AntoResetEvent中的WaitOne方法会切换信号(不怎么专业,明白就好),也就是,这次是收到信号,下次就变成无信号,再执行又有信号,如此往复
下面是AntoResetEvent实现
class Program
{
//设置事件状态为非终止 private static AutoResetEvent _autoResetEvent=new AutoResetEvent(false);
private static Thread _thread = new Thread(new ThreadStart(ThreadMethod));
private static int _count = ;
static void Main(string[] args)
{
_thread.Start();
Console.ReadLine();
_autoResetEvent.Set(); } private static void ThreadMethod()
{
while (true)
{
_autoResetEvent.WaitOne();//由于上面设置事件状态为非终止所以下面语句不会执行,除非收到可以继续的信号
Thread.Sleep();
Console.WriteLine(_count++);
_autoResetEvent.Set();//上面的WaitOne执行后变为无信号,这样下次循环就阻塞了,这步可以使下次循环接收到继续的信号 }
} }
AutoResetEvent和ManualResetEvent的更多相关文章
- C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...
- 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析
AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...
- 个人对AutoResetEvent和ManualResetEvent的理解(转载)
仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...
- AutoResetEvent和ManualResetEvent理解 z
AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandle,API相同,但在使用中还是有区别的. 每次使用时虽然理解了,但由于没有去 ...
- C#AutoResetEvent和ManualResetEvent的区别
一:终止状态和非终止状态 首先说说线程的终止状态和非终止状态.AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态.true表示 ...
- 线程同步(AutoResetEvent与ManualResetEvent)
前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...
- AutoResetEvent与ManualResetEvent区别
本文来自:http://www.360doc.com/content/10/1126/10/3267996_72536817.shtml 在.Net多线程编程中,AutoResetEvent和Manu ...
- WaitHandle、AutoResetEvent、ManualResetEvent
多线程中的锁系统(三)-WaitHandle.AutoResetEvent.ManualResetEvent 介绍 本章主要说下基于内核模式构造的线程同步方式,事件,信号量. 目录 一:理论 二:Wa ...
- 对比AutoResetEvent和ManualResetEvent
ManualResetEvent和AutoResetEvent 比较 ManualResetEvent和AutoResetEvent都继承自EventWaitHandler,它们的唯一区别就在于父类 ...
- c# AutoResetEvent和ManualResetEvent
网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘. AutoResetEvent和ManualResetEven ...
随机推荐
- 我(webabcd)的文章索引
[最后更新:2014.08.28] 重新想象 Windows Store Apps 系列文章 重新想象 Windows 8 Store Apps 系列文章 重新想象 Windows 8 Store A ...
- 杭电oj1236 排名
Tips:此题比较简单,最好将每一个学生的信息构建一个结构体,另外需要注意的是,若分数相同,排序按姓名排序,我看网上很多都是使用<algorithm>中的sort算法,只需重写cmp函数即 ...
- Unity doesn't load, no Launcher, no Dash appears
1. 重新安装 ubuntu-desktop不起作用. Enter the following commands:- Ctrl+Alt+F1 login there by user name and ...
- Java虚拟机类载入顺序
Java虚拟机在载入类的时候.先初始化父类静态变量.再初始化子类静态变量.然后载入父类,最后载入子类 public class Parent { static{ System.out.println( ...
- RMAN备份之丢失数据文件及控制文件的恢复
About Recovery with a Backup Control FileIf all copies of the current control file are lost or damag ...
- linux-FTP服务常用命令及测试
一.vsftpd服务的安装,启动及关闭1.安装vsftpd[root@rusky bdump]# yum install vsftpd --必须配置yum源才能使用yum命令来安装vsftpd,或者挂 ...
- HashMap为什么线程不安全(hash碰撞与扩容导致)
一直以来都知道HashMap是线程不安全的,但是到底为什么线程不安全,在多线程操作情况下什么时候线程不安全? 让我们先来了解一下HashMap的底层存储结构,HashMap底层是一个Entry数组,一 ...
- jmx使用应该注意的基本规范
1.标准MBean 名称必需是在要监控的类名后面加上“MBean ”. 2.监控的类和MBean 接口必需在同一包下,也可以理解为注册的接口名字必须以MBean结尾,接口实现类比接口名字少了MBean ...
- Android面试必备
好吧,说实话是自己面试被问到的和自己整理的别人的一些问题,很多问题的回答可能根据水平不同层次和深度不同,如果经常忘的话可能是还没明白原理,学习就是对对抗遗忘,现在开始复习吧: 每个面试的问题都极大的贴 ...
- L10 安装网卡驱动
一.安装网卡驱动 1. 检查各种依赖包是否安装 2. 安装 加载网卡驱动: ip: