博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程AutoResetEvent
阅读量:5997 次
发布时间:2019-06-20

本文共 2254 字,大约阅读时间需要 7 分钟。

我们在线程编程的时候往往会涉及到线程的通信,通过信号的接受来进行线程是否阻塞的操作。

AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

AutoResetEvent 的方法有很多,具体方法和扩展方法请详见,最常用方法中就有Set()和WaitOne()。

线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程通过调用 Set 发出资源可用的信号。AutoResetEvent 的非终止状态可以通过构造函数在设置

static AutoResetEvent myResetEvent = new AutoResetEvent(false);

这里构造函数中的参数false就代表该状态为非终止状态,相反若为true则为终止状态。

通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,

等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。下面我们来举一个例子:

public class Program    {        static AutoResetEvent myResetEvent = new AutoResetEvent(false);        const int cycleNum = 5;        static void Main(string[] args)        {            Thread td = new Thread(new ThreadStart(sqrt));            td.Name = "线程一";            td.Start();            Console.ReadKey();        }        ///         /// 计算平方        ///         ///         public static void sqrt()        {            myResetEvent.WaitOne();            Console.WriteLine(DateTime.Now.ToShortTimeString() + "线程一执行");            Thread.Sleep(500);        }    }

上面例子中一开始非终止状态,当遇到WaitOne()方法时则会阻塞线程,在没有set()时将一直处于阻塞状态,运行结果如下:

接下来我们在主函数中执行Set()方法来解放被阻塞的线程:

public class Program    {        static AutoResetEvent myResetEvent = new AutoResetEvent(false);        const int cycleNum = 5;        static void Main(string[] args)        {            Thread td = new Thread(new ThreadStart(sqrt));            td.Name = "线程一";            td.Start();            myResetEvent.Set();//WaitOne方法阻塞,Set()方法执行后则继续执行            Console.ReadKey();        }        ///         /// 计算平方        ///         ///         public static void sqrt()        {            myResetEvent.WaitOne();            Console.WriteLine(DateTime.Now.ToShortTimeString() + "线程一执行");            Thread.Sleep(500);        }    }

运行结果如下:


既然说到了AutoResetEvent,就不得不说ManualResetEvent,这两个方法几乎相同,不同的地方就在于AutoResetEvent的WaitOne()方法执行后会自动又将信号置为不发送状态也就是阻塞状态,当再次遇到WaitOne()方法是又会被阻塞,而ManualResetEvent则不会,只要线程处于非阻塞状态则无论遇到多少次WaitOne()方法都不会被阻塞,除非调用ReSet()方法来手动阻塞线程。这里就不截图运行结果了,有兴趣的朋友可以自己试一试。

本博客不保证所有信息全部正确,有错误还希望指出。

作者:
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。

转载于:https://www.cnblogs.com/yifengjianbai/p/5463350.html

你可能感兴趣的文章
选择排序(C语言实现) 分类: 数据结构 2015-...
查看>>
Java设计模式学习
查看>>
Quartz_1_简单编程式任务调度使用(SimpleTrigger)
查看>>
web api 初体验 解决js调用跨域问题
查看>>
centos 安装docker
查看>>
互联网架构的三板斧
查看>>
阿里巴巴MySQL DBA面试题答案[转]
查看>>
JS乘法口诀表(一行代码)
查看>>
网络、会话建立与信任
查看>>
系统级性能分析工具perf的介绍与使用
查看>>
spring remoting源码分析--Hessian分析
查看>>
phpMyAdmim和Yii 连接Mysql报错。
查看>>
基于爬山算法求解TSP问题(JAVA)
查看>>
shell语法简单介绍
查看>>
ARP缓存记录种类动态条目和静态条目
查看>>
MyEclipse 6.5 代码自动提示功能配置教程
查看>>
Linux 定时任务 crontab
查看>>
eos中BM与有BM特色的去中心化。区块链世界,白皮书为共识,代码为法律。
查看>>
字体大小自适应纯css解决方案
查看>>
Java程序员面试失败的5大原因
查看>>