java autosetevent_线程学习笔记(EventWaitHandler)AutoResetEvent的使用

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

namespace ConsoleApplication46

{

class TwoWaySignaling

{

//事件等待句柄

static EventWaitHandle _ready = new AutoResetEvent(false);

static EventWaitHandle _go = new AutoResetEvent(false);

static readonly object _locker = new object();

static string _message;

static void Main()

{

new Thread(Work).Start();

// 首先等待工作线程就绪

//(一直的连续的_go.set,会使得work里的_go.waitone来不及处理致使信号被淹没,为了使得信号不被淹没,

每次go发信号前必须用另一个信号_ready在work中发射(通过设置_ready.set()),主线程则只有等待到_ready的发射信号后才能使用go反射信号

_ready.WaitOne();//当接收到信号后才能往下执行代码

lock (_locker) _message = "ooo";

_go.Set(); // 通知工作线程执行

_ready.WaitOne();

lock (_locker) _message = "ahhh"; // 给工作线程其它信息

_go.Set();

_ready.WaitOne();

lock (_locker) _message = null; // 发信号通知工作线程退出

_go.Set();

Console.ReadKey();

}

static void Work()

{

while (true)

{

//这里ready发射信号,让主线程阻塞,等待主线程接收到ready的发射信号后(_ready.waitone等待会阻塞)

go再发射信号,否则go的信号会因为来不及处理而被淹没,之后在主线程的_ready调用_ready_waitone等待阻塞结束后,才让_go调用_go.set()继续发射信号,使得工作线程work更新控制台的输出)

_ready.Set(); // 表示我们准备好了

_go.WaitOne(); // 等待开始 .set()是发射信号,.WaitOne()则是等待信号

lock (_locker)

{

if (_message == null) return; // 优雅地退出

Console.WriteLine(_message);

}

}

}

}

}

Linux进程线程学习笔记:运行新程序

Linux进程线程学习笔记:运行新程序                                         周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...

C#线程学习笔记九:async & await入门二

一.异步方法返回类型 只能返回3种类型(void.Task和Task). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...

C#线程学习笔记五:线程同步--事件构造

本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Event_Constructor.html,记录一下学习过程以备后续查用. 前面讲的线 ...

C#线程学习笔记六:线程同步--信号量和互斥体

本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html,记录一下学习过程以备后续查用.     ...

C#线程学习笔记四:线程同步

本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/21/ThreadsSynchronous.html,记录一下学习过程以备后续查用.     ...

C#线程学习笔记三:线程池中的I/O线程

本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/20/MultiThreads.html,记录一下学习过程以备后续查用.     一.I/O线 ...

C#线程学习笔记二:线程池中的工作者线程

本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/ThreadPool.html,记录一下学习过程以备后续查用. 一.线程池基础 首先,创 ...

C#线程学习笔记一:线程基础

本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习过程以备后续查用. 一.线程的介绍 进程(Proce ...

C#线程学习笔记

本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习,方便后面资料查找 一.线程的介绍 进程(Proce ...

随机推荐

vim编辑器详解

vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率. vi是“visual interface”的 ...

「2014-4-13」Think twice before starting the adventure

杂文一篇. 1. 取名字真心是一件特别困难的事情.这位独立开发者花了将近两天的时间,给他的私人项目取了个名字:这篇博客里显然还忽视了一个原因,就是名字取得太烂以至 ...

mysql控制流程函数

1.case语句 select case 2 when 1 then '男' when 2 then '女' else 'xoap' end as result; 2.if语句 select if(1 ...

The Lost Art of C Structure Packing

对齐要求 首先需要了解的是,对于现代处理器,C编译器在内存中放置基本C数据类型的方式受到约束,以令内存的访问速度更快. 在x86或ARM处理器中,基本C数据类型通常并不存储于内存中的随机字节地址.实际 ...

深度学习工具caffe具体安装指南

caffe安装指南-吐血整理 前言: 在一台系统环境较好的linux机器上能够非常easy的安装caffe,可是假设系统本身非常旧,又没有GPU的话.安装就太麻烦了,全部都得从头做起,本文档旨在尽可能 ...

drools6 基本使用 -- 2

续drools6 基本使用1 http://blog.csdn.net/cloud_ll/article/details/26979355 8. 创建src/main/test folder.把dro ...

onS 记录

1.用户的解锁                                                         用户因多次登录失败而被锁的情况下,可用faillog命令来解锁.具体如下 ...

hdu 4514 并查集+树形dp

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

angular使用Md5加密

一.现象 用户登录时需要记住密码的功能,在前端需要对密码进行加密处理,增加安全性 二解决 1.利用npm(如果没有,先自行安装npm)安装ts-md5 npm install ts-md5 --sav ...

day053 url反向解析图解 模板渲染

一.语法 两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二.变量 1. 可直接用  {{ 变量名 }} (可调用字符串, 数字 ,列表,字典,对象等) ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值