基元线程同步构造之waithandle中 waitone使用
在使用基元线程同步构造中waithandle中waitone方法的讲解:
调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 WaitHandle 收到绿灯信号。
WaitHandle有两个状态"Signaled" and "Nonsignaled",前者可以理解为绿灯,绿灯状态时WaitOne方法无效,当前线程不会被阻止,后者可以理解为红灯,WaitOne()方法会阻止当前线程。
(1):一般来说,初始状态都是"Nonsignaled",即红灯,这样当调用WaitOne时,线程会暂停掉,这正是通常情况下我们调用WaitOne时想要的效果。这也正是Reset(字面义“重置”)被定义为设成红灯的原因。所以初始化时参数用false,代表初始状态为红灯。
using System;
using System.Threading;
class WaitOne
{
//初始化为 false,即Nonsignaled,必须调用set后才能变成Signaled,
//autoEvent.WaitOne();之后的代码才会运行,如果去掉
//ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
//autoEvent.WaitOne();之后的代码就永远不会运行了
//如果初始化为 true即 new AutoResetEvent(true),去掉 ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
//autoEvent.WaitOne();之后的代码也可运行
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Main starting.");
ThreadPool.QueueUserWorkItem(
new WaitCallback(WorkMethod), autoEvent);
// Wait for work method to signal.
autoEvent.WaitOne();
Console.WriteLine("Work method signaled.\nMain ending.");
Console.ReadLine();
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("Work starting.");
// Simulate time spent working.
Thread.Sleep(new Random().Next(100, 2000));
// Signal that work is finished.
Console.WriteLine("Work ending.");
((AutoResetEvent)stateInfo).Set();
}
}
这是个人的一点点理解,希望大伙有好的意见再拍拍砖。。。。。。。
最新文章
- W3School-CSS 表格实例
- js 刷新窗口
- SQL Pass北京举办第11次线下活动,欢迎报名(本次活动特别邀请了来自微软总部Xin Jin博士)
- AR播放器
- PhpStorm的open in browser怎么修改端口和相对路径
- SonarLint插件的安装与使用
- Android小项目练习之一 项目简介
- Codeforces Gym 100002 D";Decoding Task"; 数学
- uitableview的重用重叠问题
- STM32串口通信USART1转USART2问题解决
- css布局理解
- vue-cli@2的原理解析
- HotSpot虚拟机对象探秘(对象创建,对象内存布局,对象访问定位)
- (一)七种AOP实现方法
- poj 1151 (未完成) 扫描线 线段树 离散化
- byte[]->;new String(byte[]) ->; getByte()引发的不一致问题
- mongodb集群性能优化
- .join() ----- 是把列表中的元素用 ";xx";.join() 拼接成字符串
- 7款开源ERP系统比较
- java 集合stream操作