多线程中 ManualResetEvent 的用法[通俗易懂]

多线程中 ManualResetEvent 的用法[通俗易懂]///<summary>///手动重启///</summary>privateManualResetEventmanualReset=newManualR

大家好,又见面了,我是你们的朋友全栈君。

        /// <summary>
        /// 手动重启
        /// </summary>
        private ManualResetEvent manualReset = new ManualResetEvent(false);
                if (suspend)
                {
                    manualReset.WaitOne();//暂停发送
                }
            SuspendCommand = new RelayCommand(o => { suspend = true; manualReset.Reset(); });
            RestoreCommand = new RelayCommand(o=> { suspend = false; manualReset.Set(); });

它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源

 ## 

ManualResetEvent manualReset = new ManualResetEvent(false);
构造函数参数为 False:代表无信号,True:代表有信号
当无信号时,manualReset.WaitOne(); 代表没人通知它,所以它默认就是阻塞状态。调用Set()方法后代表有人通知它来信号了,它将停止阻塞。
当有信号时,manualReset.WaitOne(); 代表有人通知它,它将无阻塞。 调用Reset()方法代表有人通知它现在信号没了,它将继续开始阻塞。

 在多线程开发中,时常用到 ManualResetEvent 与 AutoResetEvent  。 它们如同道路交通中的信号灯。两者之间有什么区别呢?

共同点:

           均继承 EventWaitHandle 接口,因此,均具有以下功能:

           Reset() //红灯

           Set() //绿灯

           WaitOne() // 等待信号

 

不同点:

            AutoResetEvent   收到 Set 后 , 一次只能执行一个线程,其它线程继续 WaitOne 。

           ManualResetEvent  收到 Set 后,所有处理 WaitOne 状态线程均继续执行。

参考文章:https://www.cnblogs.com/howtrace/p/11362284.html  https://www.cnblogs.com/li-peng/p/3291306.html

 

运行图说明

多线程中 ManualResetEvent 的用法[通俗易懂]

图片来源:https://www.cnblogs.com/lihuali/p/11672088.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154809.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月1日 上午8:00
下一篇 2022年7月1日 上午8:16


相关推荐

  • Eclipse汉化教程(详细图解)

    Eclipse汉化教程(详细图解)eclipse语言包下载:http://www.eclipse.org/babel/downloads.php1、打开浏览器,浏览“参考资料”内给出的“eclipse语言包下载”地址,在博客新页面找到地址链接,如图所示。“BabelLanguage…”开头的一栏下面就是各个eclise版本的语言包,2、目标锁定“BabelLanguagePackUpdateSiteforNeon”

    2022年6月5日
    153
  • exclusions来进行排除依赖

    exclusions来进行排除依赖xclusions 但依赖调节并不解决所有问题 我们还需要 exclusions 来进行排除依赖 例如这样一个情况 工程中引入了 A A 依赖 B 但是 B 的版本过旧 此时可以使用 exclusions 排除该传递性依赖 并显示声明一个最新版本的 B 依赖 比如这样 lt dependency gt lt groupId gt com lowagie lt groupId

    2026年3月18日
    2
  • 软件测试人员可以考哪些证书?

    软件测试人员可以考哪些证书?现在到外面求职 说破嘴皮子都不如一张证书来的痛快 尤其这种职业技能证书 更是受到企业的青睐 那么作为一名软件测试人员可以考哪些证书来证明自己呢 ISTQB 国际软件测试资格认证 ISTQB 是国际唯一权威的软件测试资质认证机构 有这个证书的话 对于求职名企 外企非常有用 截至目前全球范围内参加过 ISTQB 认证的软件测试工程师近 830 000 人 ISTQB 作为国际性的软件测试工程师认证 社会认可度还是非常高的 越来越多的跨国公司和从事软件外测试外包的公司要求软件测试人员需要获得 ISTQB 认证

    2026年3月17日
    2
  • 第一章:什么是数据化运营「建议收藏」

    第一章:什么是数据化运营「建议收藏」1.1现代营销理论的发展历程1.1.1从4P到4C(商品丰富、市场竞争日益激烈、消费者成为商业世界核心)4P(以产品为中心的营销)理论Product(产品):注重产品功能,强调独特卖点Pric

    2022年8月4日
    7
  • win7下vs2008过期没有输入序列号的解决办法[通俗易懂]

    win7下vs2008过期没有输入序列号的解决办法[通俗易懂]vs2008在win7下过期后,无法找到升级的序列号输入框。使用网上修改Setup\setup.sdb不得法,输入序列号却没有输入的地方。经过查找发现在win7下序列号输入框已被隐藏,使用打补丁方式可现实输入框。

    2022年8月10日
    19
  • JS 后退 刷新 前进

    JS 后退 刷新 前进Code:”http://www.w3.org/1999/xhtml” >        无标题页  “javascript”>   function back()  {       history.go(-1);  //后退1页  }   function forward(

    2022年7月25日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号