多线程随笔一(AutoResetEvent和ManulResetEvent)
AutoResetEvent和ManulResetEvent是.net中用来做线程的同步的两个类。从类名上不难看出,这两个类的区别在于一个是自动的,一个是手动的(这不是废话嘛)。两个类的实现原理大致相同,主要是初始化类对象的时候,设置一个状态位,通过判断这个状态位,决定代码是继续执行还是等待。
常用的方法有以下四个:
构造函数,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)的更多相关文章
- JAVA 多线程随笔 (三) 多线程用到的并发容器 (ConcurrentHashMap,CopyOnWriteArrayList, CopyOnWriteArraySet)
1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...
- JAVA 多线程随笔 (一) 可见性和volatile关键字
// 先上代码 1 public class NoVisibility { private static boolean ready; private static int number; priva ...
- 一个实例明白AutoResetEvent和 ManulResetEvent的用法
先看一段代码: public class WaitHandlerExample { public static AutoResetEvent waitHandler; ...
- 多线程随笔二(Task)
Task类是.net 4.0新加进来的特性,对原有的Thread,ThreadPool做了进一步的封装,使得.net平台上的多线程编程变得更加方便.废话不多说,进入正题. 一. Task启动 Task ...
- c# 多线程编程中AutoResetEvent和ManualResetEvent
作为等同于Java的wait,notify,notifyAll的存在,AutoResetEvent和ManualResetEvent分别实现了notify和notifyAll的功能,下面的代码简单讲解 ...
- JAVA 多线程随笔 (二) sleep, yield, join, wait 和notify
这里先说明一下锁对象,如果一个类比如Person里的方法都有synchronized来修饰,那么每一个方法的锁对象就是Person的一个实例person. 锁对象也可以针对某个特定的实例, 比如syn ...
- 多线程随笔知识点总结-NSThread4.1
线程的状态 状态说明 a.新建 实例化线程对象 b.就绪 向线程对象发送start消息,线程对象被加入可调度线程池等待CPU调度;detach方法和performSelectorInBackGroun ...
- C#多线程之二:ManualResetEvent和AutoResetEvent
初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...
- C#多线程之 ManualResetEvent和AutoResetEvent
初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...
随机推荐
- IE8下提示'console'未定义错误
在开发的过程中由于调试的原因,在代码中加入console.info("xxxx"),而未进行删除 在IE8下测试该代码所在的页面报错,如下: 需要注意的是,使用console对象查 ...
- JS错误:Uncaught SyntaxError: Unexpected token ILLEGAL
$('tbody', '#' + tableId).append('<tr onmouseover="this.style.backgroundColor=\'#eeeeee\'&qu ...
- T-SQL的10个好习惯
有关T-SQL的10个好习惯 1.在生产环境中不要出现Select * 这一点我想大家已经是比较熟知了,这样的错误相信会犯的人不会太多.但我这里还是要说一下. 不使用Select *的原因主要不是坊间 ...
- CKEditor4.x部署和配置
CKEditor4.x && JSP 官网下载CKEditor,可选Basic, Standard, Full 解压放置其WebRoot下 JSP中引入以下文件: <script ...
- 转---高并发Web服务的演变——节约系统内存和CPU
[问底]徐汉彬:高并发Web服务的演变——节约系统内存和CPU 发表于22小时前| 4223次阅读| 来源CSDN| 22 条评论| 作者徐汉彬 问底Web服务内存CPU并发徐汉彬 摘要:现在的Web ...
- javascript中的promise和deferred:实践(二)
javascript中的promise和deferred:实践(二) 介绍: 在第一节呢,我花了大量的时间来介绍promises和deferreds的理论.现在呢,我们来看看jquery中的promi ...
- S3C2440之IIC裸机驱动
花了两天的时间终于把这个搞定了,其实I2C的原理还是比较简单的,只是几个细节性的东西还是需要特别的注意,主要是需要注意一下几点: 1.rIICCON &= ~0x10; 清中断必须要在rIIC ...
- Python 3语法小记(五)字符串
Python 3 的源码的默认编码方式为 UTF-8 在Python 3,所有的字符串都是使用Unicode编码的字符序列. utf-8 是一种将字符编码成字节序列的方式.字节即字节,并非字符.字符在 ...
- 服务器如何防ssh服务暴力破解??
如图: 当我们遭到暴力破解ssh服务该怎么办 内行看门道 外行看热闹 下面教大家几招办法: 1 密码足够的复杂,密码的长度要大于8位最好大于20位.密码的复杂度是密码要尽可能有数字.大小写字母和特 ...
- java中的instanceof
instanceof是Java.php的一个二元操作符(运算符),和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实 ...