C# ManualResetEvent的理解和用法

ManualResetEvent是C#中一个比较常用的工具,可用于线程间通信,实现一种类似信号量的功能。

    这里的信号量与Java中的信号量Semaphore不同。

    Java中的信号量Semaphore,是控制有限资源的并发访问。

    这里的ManualResetEvent,更像是一种线程挡板。

    先了解一下ManualResetEvent的基本用法:

1、初始化:public ManualResetEvent(bool initialState);

  ManualResetEvent的构造方法有个bool型参数,当为true时,则表示有信号,为false时,则表示无信号。

      这个怎么理解呢?我们接着看ManualResetEvent3个基本方法中的WaitOne方法。

2、WaitOne方法:WaitOne方法有几种4种重载,我在这里只对它的功能进行分析。

  WaitOne方法,顾名思义,它会具有一种等待的功能,也就是线程阻塞。

      这里的阻塞功能是有条件的,当无信号时,它是阻塞的,有信号时,它将无任何阻塞,被执行时就直接跳过了。

       所以,回顾到1,当初始化ManualResetEvent时,initialState为false,WaitOne将会有阻塞效果,否则,没有阻塞效果。

3、Set方法:将ManualResetEvent对象的信号状态设为有信号状态,

     这个时候WaitOne如果正在阻塞中的话,将会立即终止阻塞,向下继续执行。

     而且这个状态一直不变的话,每次执行到WaitOne都将无任何阻塞。

4、Reset方法:

     将ManualResetEvent对象的信号状态设为无信号状态,当下次执行到WaitOne时,又将重新开始阻塞。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;namespace ThreadTest
{class Program{static void Main(string[] args){new ProductAndCostTester();}}/// <summary>/// 生产消费模型/// </summary>public class ProductAndCostTester{/// <summary>/// 生产线1线程/// </summary>private Thread _producterThread1;/// <summary>/// 生产线2线程/// </summary>private Thread _producterThread2;/// <summary>/// 消费线线程/// </summary>private Thread _costerThread;/// <summary>/// 产品列表/// </summary>private List<int> _goodList;/// <summary>/// ManualResetEvent实例/// </summary>private ManualResetEvent _mre;public ProductAndCostTester(){_goodList = new List<int>();_mre = new ManualResetEvent(false);//false初始化状态为无信号,将使WaitOne阻塞_producterThread1 = new Thread(Product1);_producterThread1.Name = "Productor1";_producterThread1.Start();_producterThread2 = new Thread(Product2);_producterThread2.Name = "Productor2";_producterThread2.Start();_costerThread = new Thread(Cost);_costerThread.Name = "Costor";_costerThread.Start();}/// <summary>/// 生产线1/// </summary>void Product1(){while (true){Console.WriteLine(Thread.CurrentThread.Name + ":" + DateTime.Now.ToString("HH:mm:ss"));for (int i = 0; i < 3; i++){_goodList.Add(1);}_mre.Set();//表示有信号了,通知WaitOne不再阻塞Thread.Sleep(8000);}}/// <summary>/// 生产线2/// </summary>void Product2(){while (true){Console.WriteLine(Thread.CurrentThread.Name + ":" + DateTime.Now.ToString("HH:mm:ss"));for (int i = 0; i < 6; i++){_goodList.Add(1);}_mre.Set();//表示有信号了,通知WaitOne不再阻塞Thread.Sleep(10000);}}/// <summary>/// 消费线/// </summary>void Cost(){while (true){if (_goodList.Count > 0){Console.WriteLine("Cost " + _goodList.Count + " at " + DateTime.Now.ToString("HH:mm:ss"));_goodList.Clear();_mre.Reset();//重置为无信号了,使WaitOne可以再次阻塞}else{Console.WriteLine("No cost at " + DateTime.Now.ToString("HH:mm:ss"));_mre.WaitOne();//如果没有可消费的产品,即无信号,则会阻塞}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/843071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全攻防三

一、IDS: 当黑客绕过了防火墙&#xff0c;你该如何发现&#xff1f; IDS &#xff08;Intrusion Detection System&#xff0c;入侵检测系统&#xff09; NIDS 内网中检测网络流量攻击 黑客如果已经进去内网&#xff0c;防火墙就没办法保护了 NIDS部署在交换机和路由器这些路…

从零开始实现自己的串口调试助手(1) - ui界面搭建

UI 界面搭建 ui界面整体演示 ui对象拆分 更多的细节就不方便展开了&#xff0c;下面有提示完成ui设计的提示 在创建工程前 记得把编码改为utf-8 ui设计技巧: ctrl 鼠标左键实现拖动实现复制粘贴 groupBox &#xff1a; 带标题的文本框 栅格布局 -- 只有一个控件的时候会铺满…

RTSPtoWebRTC、RTSPtoWeb ( 自HTML播放):页面中预览摄像机视频,无插件的播放方式,适合局域网使用,无需流媒体服务器

文章目录 引言I 环境准备II RTSPtoWebRTC2.1 下载和编译2.2 配置config.jsonIII RTSPtoWebRTC问题优化: 使用http接口生成视频资源进行播放3.1 调用http接口生成视频资源进行播放3.2 启动关闭IV RTSPtoWeb4.1 config.json4.2 RTSPPlayersee also引言 需求: 海域感知,云台监控…

vue系列之 插槽(Slot) 详解

插槽在vue中是一种很常见的写法&#xff0c;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式。一共有三种分类&#xff1a;默认插槽、具名插槽、作用域插槽&#xff0c;下面一一结合案例详细说明。原创不易&#xff0c;需要的小伙伴 收藏关注 哦…

基于Vue的自定义服务说明弹窗组件的设计与实现

基于Vue的自定义服务说明弹窗组件的设计与实现 摘要 随着技术的不断发展&#xff0c;前端开发面临着越来越高的复杂性和不断变化的需求。传统开发方式往往将整个系统构建为整块应用&#xff0c;这导致对系统的任何微小改动都可能触发整体的逻辑变更&#xff0c;从而增加了开发…

B站pink老师HTML5基础(一)

文章目录 一、网页1.什么是网页2.什么是HTML二、常用浏览器 三、Web标准四、HTML标签1.HTML基本结构标签 五、快捷键六、常用标签1.标题标签2.段落和换行标签3.文本格式化标签4.div标签和span标签5.图像标签6.图像路径7.超链接标签8.特殊字符 一、网页 1.什么是网页 2.什么是H…

什么是领导力?如何提高领导能力?

什么是领导能力&#xff1f; 简单来说&#xff0c;领导力就是通过自身的影响力&#xff0c;让他人服从自己的想法行动&#xff0c;在一个组织和集体中&#xff0c;领导力的作用十分重要。对于一个公司的管理层来说&#xff0c;领导能力是不可或缺的一部分&#xff0c;公司存在…

黑马python-面向对象程序设计

1.定义类 class 类名&#xff1a; 代码 ….. 注意&#xff1a;类名要满足标识符命名规则&#xff0c;同时遵循大驼峰命名习惯 2.self&#xff1a; self指调用该函数的对象 3.创建对象 对象名类&#xff08;&#xff09; 4.添加获取对象属性 对象名.属性名值 5._init_()方法&…

Spring Aware接口:揭秘Bean生命周期中的“先知”角色与源码剖析

1. 引言 在Spring框架中&#xff0c;Bean的生命周期是一个复杂而精细的过程&#xff0c;涉及到Bean的创建、初始化、属性注入以及销毁等多个阶段。为了增强Bean与Spring容器之间的交互能力&#xff0c;Spring提供了一系列Aware接口&#xff0c;这些接口允许Bean在生命周期的不…

Hadoop+Spark大数据技术 实验8 Spark SQL结构化

9.2 创建DataFrame对象的方式 val dfUsers spark.read.load("/usr/local/spark/examples/src/main/resources/users.parquet") dfUsers: org.apache.spark.sql.DataFrame [name: string, favorite_color: string ... 1 more field] dfUsers.show() -----------…

Day7: LeedCode 454. 四数相加 II 383.赎金信 15.三数之和 18.四数之和

详细讲解移步: Day7: LeedCode 454. 四数相加 II 383.赎金信 15.三数之和 18.四数之和-CSDN博客 454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i,…

李飞飞亲自撰文:大模型不存在主观感觉能力,多少亿参数都不行

近日&#xff0c;李飞飞连同斯坦福大学以人为本人工智能研究所 HAI 联合主任 John Etchemendy 教授联合撰写了一篇文章&#xff0c;文章对 AI 到底有没有感觉能力&#xff08;sentient&#xff09;进行了深入探讨。 「空间智能是人工智能拼图中的关键一环。」知名「AI 教母」李…

【数据结构】P1 数据结构是什么、算法怎样度量

1.1 基本概念与术语 数据&#xff1a; 数据是信息的载体&#xff0c;是所有能被计算机识别以及处理的符号。数据元素&#xff1a; 数据元素是数据基本单位&#xff0c;由若干 数据项 组成&#xff0c;数据项是构成数据元素最小的单位。 e . g . e.g. e.g. 数据元素如一条学生记…

[Python] VS python未能启动调试适配器

原因&#xff1a;调试适配器版本与python版本不一致导致无法启动&#xff0c;通常是选用的适配器的版本过新。 作者&#xff1a;东京微风吹凉 https://www.bilibili.com/read/cv12027862/ 出处&#xff1a;bilibili 尝试&#xff1a;更换环境为 Py 3.11&#xff08;64bit&…

Leetcode 2028

思路&#xff1a;1-6之间的的n个数组合起来要变成sum_t mean*(rolls.size()n) - sum(rolls) ; 那么可以先假设每个数都是sum_t / n 其中这个数必须要在1 - 6 之间否者无法分配。 然后可以得出n * (sum_t / n ) < sum ; 需要对余数mod进行调整&#xff0c;为了减少调整的次…

接口测试及接口测试常用的工具详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息…

深入了解 CSS 预处理器 Sass

今天我们来深入探讨一下 CSS 预处理器 Sass。我们将学习什么是 Sass,如何使用它,以及它是如何工作的。 什么是 Sass? Sass 是 syntactically awesome style sheets 的缩写,是一种 CSS 预处理器。它是 CSS 的扩展,为基础 CSS 增加了更多的功能和优雅。普通的 CSS 代码很容…

初学java java script是什么!

java script是什么&#xff01; JavaScript是世界上最流行的语言之一&#xff0c;是一种运行在客户端的脚本语言(Script是脚本的意思) 脚本语言:不需要编译&#xff0c;运行过程中由js 解释器(js 引擎)逐行莱进行解释并执行 现在也可以基于 Nodejs 技术进行服务器端编程 ja…

sklearn监督学习--k近邻算法

sklearn监督学习 一、分类与回归二、泛化、过拟合与欠拟合三、k近邻算法四、分析KNeighborsClassifier五、k近邻算法用于回归优点、缺点和参数 一、分类与回归 监督学习是最常用也是最成功的机器学习类型之一。监督机器学习问题主要有两种&#xff0c;分别叫做分类与回归。分类…

IDEA项目通过 tomcat运行报错: 404 请求的资源不可用

SpringBootVue项目 IDEA运行 Tomcat&#xff0c;自动打开网页报错 HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/WarehouseManagerApi_war/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/9.0.89 但是运行访问 …