AutoResetEvent和ManulResetEvent是.net中用来做线程的同步的两个类。从类名上不难看出,这两个类的区别在于一个是自动的,一个是手动的(这不是废话嘛)。两个类的实现原理大致相同,主要是初始化类对象的时候,设置一个状态位,通过判断这个状态位,决定代码是继续执行还是等待。

  常用的方法有以下四个:

1. AutoResetEvent(Boolean)

  构造函数,MSDN的解释为Initializes a new instance of the AutoResetEvent class with a Boolean value indicating whether to set the initial state to signaled.

  通过一个Bool值设置初始的信号状态(true为已接收到信号,false为未接收到信号)。

  2. Reset()

    MSDN的解释为Sets the state of the event to nonsignaled, causing threads to block.

    设置状态为未接收到信号,引起线程阻塞。

  3. Set()

    MSDN的解释为Sets the state of the event to signaled, allowing one or more waiting threads to proceed.

    设置状态为已接收到信号,该状态下线程能正常执行。

  4. WaitOne():

    MSDN的解释为Blocks the current thread until the current WaitHandle receives a signal.

    阻塞当前线程,知道接收到信号。

看了这三个方法的解释,就不难理解这几个方法的用途。通过调用WaitOne方法,阻塞当前线程,判断状态位,如果状态为已接收到信号(初始化为true或调用Set方法),继续执行后续代码,否则(初始化为false或调用Reset方法),等待直到信号状态变为已接收到信号。那么AutoResetEvent和ManulResetEvent在使用上有什么区别呢?其实区别很简单,AutoResetEvent在每次调用WaitOne通过之后,都会调用Reset,将状态置为未接收到信号状态,引起其他WaitOne的阻塞,而ManulResetEvent则不会这么做。类似于AutoResetEvent通过一个后就把闸机关上了,ManulResetEvent则一直保持畅通状态。

第一次写博客,关于AutoResetEvent和ManulResetEvent的内容先写到这,之后再补上Thread,Task等内容。

多线程随笔一(AutoResetEvent和ManulResetEvent)的更多相关文章

  1. JAVA 多线程随笔 (三) 多线程用到的并发容器 (ConcurrentHashMap,CopyOnWriteArrayList, CopyOnWriteArraySet)

    1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...

  2. JAVA 多线程随笔 (一) 可见性和volatile关键字

    // 先上代码 1 public class NoVisibility { private static boolean ready; private static int number; priva ...

  3. 一个实例明白AutoResetEvent和 ManulResetEvent的用法

    先看一段代码: public class WaitHandlerExample {                 public static AutoResetEvent waitHandler;  ...

  4. 多线程随笔二(Task)

    Task类是.net 4.0新加进来的特性,对原有的Thread,ThreadPool做了进一步的封装,使得.net平台上的多线程编程变得更加方便.废话不多说,进入正题. 一. Task启动 Task ...

  5. c# 多线程编程中AutoResetEvent和ManualResetEvent

    作为等同于Java的wait,notify,notifyAll的存在,AutoResetEvent和ManualResetEvent分别实现了notify和notifyAll的功能,下面的代码简单讲解 ...

  6. JAVA 多线程随笔 (二) sleep, yield, join, wait 和notify

    这里先说明一下锁对象,如果一个类比如Person里的方法都有synchronized来修饰,那么每一个方法的锁对象就是Person的一个实例person. 锁对象也可以针对某个特定的实例, 比如syn ...

  7. 多线程随笔知识点总结-NSThread4.1

    线程的状态 状态说明 a.新建 实例化线程对象 b.就绪 向线程对象发送start消息,线程对象被加入可调度线程池等待CPU调度;detach方法和performSelectorInBackGroun ...

  8. C#多线程之二:ManualResetEvent和AutoResetEvent

    初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...

  9. C#多线程之 ManualResetEvent和AutoResetEvent

    初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...

随机推荐

  1. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)

    <Troubleshooting SQL Server>读书笔记-CPU使用率过高(下) 第三章 High CPU Utilization. CPU使用率过高的常见原因 查询优化器会尽量从 ...

  2. SQL Server 2008 - Cannot set a credential for principal 'sa'.

    SQL Server 2008 - Cannot set a credential for principal 'sa'. 很久没有用到SQL Server了,今天有幸在帮同事解决一个SQL Serv ...

  3. 【c++】指针参数是如何传递内存的

    [c++]指针参数是如何传递内存的   如果函数的参数是一个指针,不要指望用该指针去动态申请内存.如下: void GetMemory(char *p, int num) { p = (char *) ...

  4. Spring.Net-创建对象

    1:通过构造函数创建对象    在配置文件中,指明对象类型<object id="" type="类型全名,程序集名" />    在代码中指定对象 ...

  5. 从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器

    先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...

  6. 各浏览器的cookie的name个数/最大容量限制测试

    测试代码 for(var ii = 0; ii< 5000;ii++){ if (!window.ia) window.ia=0; window.ia++; var s = 'a'+window ...

  7. sql数据黑马程序员——SQL入门

    最近研究sql数据,稍微总结一下,以后继续补充: ---------------------- ASP.Net+Android+IO开辟S..Net培训.等待与您交流! --------------- ...

  8. Android RecyclerView体验(一)- 简介

    在网上关于RecyclerView的基本使用方式已经有了比较详细介绍,而且其设计结构也类似于ListView,所以本文将不重点介绍如何使用,在文末的引用中都可以相关内容.这里主要是介绍Recycler ...

  9. FragmentTransation中的remove和detach有什么区别?

    remove(): 从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁; detach(): 会将vi ...

  10. java-并发解决方案

    并发产生数据不一致的原因:1.程序共享对象:2.多线程.3.基于1和2,取出来的数据可能不是最新的. 解决方案:只要是原子性操作,就不会出现问题.原子性操作,代表cpu会一直执行这个操作,知道结束. ...