温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用AutoResetEvent控制线程

发布时间:2021-06-23 14:16:11 来源:亿速云 阅读:156 作者:Leah 栏目:大数据

本篇文章为大家展示了如何使用AutoResetEvent控制线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

AutoResetEvent概念

  • AutoResetEvent对象用来进行线程同步操作,AutoResetEvent类继承waitHandle类。waitOne()方法就继承来自waitHandle类。

  • AutoResetEvent对象有终止和非终止两种状态,终止状态是线程继续执行,非终止状态使线程阻塞,可以调用set和reset方法使对象进入终止和非终止状态。-》可以简单理解如果AutoResetEvent对象是终止状态,就像不管别人了,任你撒野去(waitOne()得到的都是撒野信号)

  • AutoResetEvent顾名思义,其对象在调用一次set之后会自动调用一次reset,进入非终止状态使调用了等待方法的线程进入阻塞状态。-》可以简单理解如果AutoResetEvent对象是非终止状态,就开始管理起别人来了,此时waitOne()得到的信号都是呆在原地不动信号。

  • waitHandle对象的waitone可以使当前线程进入阻塞状态,等待一个信号。直到当前 waitHandle对象收到信号,才会继续执行。

  • set可以发送一个信号,允许一个调用waitone而等待线程继续执行。 ManulResetEvent的set方法可以允许多个。但是要手动关闭,即调用reset();

  • reset可以使因为调用waitone() 而等待线程都进入阻塞状态。

AutoResetEvent主要方法有

  1. AutoResetEvent(bool initialState):构造函数,用一个指示是否将初始状态设置为终止的布尔值初始化该类的新实例。 false:无信号,子线程的WaitOne方法不会被自动调用 true:有信号,子线程的WaitOne方法会被自动调用

  2. Reset ():将事件状态设置为非终止状态,导致线程阻止;如果该操作成功,则返回true;否则,返回false。

  3. Set ():将事件状态设置为终止状态,允许一个或多个等待线程继续;如果该操作成功,则返回true;否则,返回false。

  4. WaitOne(): 阻止当前线程,直到收到信号。

  5. WaitOne(TimeSpan, Boolean) :阻止当前线程,直到当前实例收到信号,使用 TimeSpan 度量时间间隔并指定是否在等待之前退出同步域。

有了上面的解释,开始展示代码

//若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false        static AutoResetEvent oddResetEvent = new AutoResetEvent(false);        static AutoResetEvent evenResetEvent = new AutoResetEvent(false);        static int i = 0;        static void Main(string[] args)        {            //ThreadStart是个委托            Thread thread1 = new Thread(new ThreadStart(show));            thread1.Name = "偶数线程";            Thread thread2 = new Thread(new ThreadStart(show));            thread2.Name = "奇数线程";            thread1.Start();            Thread.Sleep(200);            thread2.Start();            Console.Read();
       }        public static void show()        {            if (i == 1) evenResetEvent.WaitOne();            while (i <= 100)            {                int num = i % 2;                if (num == 0)                {                    Console.WriteLine("{0}:{1}  {2}    ", Thread.CurrentThread.Name, i++, num);                    evenResetEvent.Set();                    oddResetEvent.WaitOne();                }               else                {                      Console.WriteLine("{0}:{1}  {2}    ", Thread.CurrentThread.Name, i++, num);                    //如果此时AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。否则不会被阻止                    oddResetEvent.Set();                    evenResetEvent.WaitOne();                }            }        }

结果如下图所示:
如何使用AutoResetEvent控制线程


上述内容就是如何使用AutoResetEvent控制线程,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI