详解 ManualResetEvent

详解 ManualResetEvent今天详细说一下ManualResetEvent它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源当一个线程开始一个活动(此活动必须完成后,其他线程才能

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

今天详细说一下ManualResetEvent

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

Reset 以将 ManualResetEvent 置于非终止状态。ManualResetEventManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。

ManualResetEvent 将保持终止状态,直到它被手动重置。WaitOne 的调用将立即返回。

ManualResetEventDemo.rar

ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false

 class Program
    {
        static ManualResetEvent _mre = new ManualResetEvent(false);
        static void Main(string[] args)
        {
            Thread[] _threads = new Thread[3];
            for (int i = 0; i < _threads.Count(); i++)
            {
                _threads[i] = new Thread(ThreadRun);
                _threads[i].Start();
            }
           
        }

        static void ThreadRun()
        {
            int _threadID = 0;
            while (true)
            {
                _mre.WaitOne();
                _threadID = Thread.CurrentThread.ManagedThreadId;
                Console.WriteLine("current Tread is " + _threadID);
                Thread.Sleep(TimeSpan.FromSeconds(2));
                  
            }
        }
    }

当初始化为true时,为终止状态

static ManualResetEvent _mre = new ManualResetEvent(true);

执行结果

 <span role="heading" aria-level="2">详解 ManualResetEvent

当初始化为false时,为非终止状态

static ManualResetEvent _mre = new ManualResetEvent(false);

执行结果为

<span role="heading" aria-level="2">详解 ManualResetEvent

这样我们就能看出来

终止状态时WaitOne()允许线程访问下边的语句

非终止状态时WaitOne()阻塞线程,不允许线程访问下边的语句

我们也可以把WaitOne()放在方法最下边

static void ThreadRun()
        {
            int _threadID = 0;
            while (true)
            {
                
                _threadID = Thread.CurrentThread.ManagedThreadId;
                Console.WriteLine("current Tread is " + _threadID);
                Thread.Sleep(TimeSpan.FromSeconds(2));
                _mre.WaitOne();
            }
        }

当初始化为true时执行结果和上边的一样会不停的执行

<span role="heading" aria-level="2">详解 ManualResetEvent

初始化为false时执行到waitOne()时就阻塞线程不会再往下执行了

<span role="heading" aria-level="2">详解 ManualResetEvent

接下来你可能就会想当在非终止状态时怎么让线程继续执行,怎么再让它停下来,这就要用了set()和Reset()方法了

把非终止状态改为终止状态用Set()方法

把终止状态改为非终止状态用Reset()方法

我用用代码来实现它们只要把我们上 边的代码做一下改动

class Program
    {
        static ManualResetEvent _mre = new ManualResetEvent(false);
        static void Main(string[] args)
        {
            Console.WriteLine("输入1为Set()   开始运行");
            Console.WriteLine("输入2为Reset() 暂停运行");
            Thread[] _threads = new Thread[3];
            for (int i = 0; i < _threads.Count(); i++)
            {
                _threads[i] = new Thread(ThreadRun);
                _threads[i].Start();
            }
            while (true)
            {
                switch (Console.ReadLine())
                {
                    case "1":
                        _mre.Set();
                        Console.WriteLine("开始运行");
                        break;
                    case "2":
                        _mre.Reset();
                        Console.WriteLine("暂停运行");
                        break;
                    default:
                        break;
                }
            }
           
        }

        static void ThreadRun()
        {
            int _threadID = 0;
            while (true)
            {
                
                _threadID = Thread.CurrentThread.ManagedThreadId;
                Console.WriteLine("current Tread is " + _threadID);
                Thread.Sleep(TimeSpan.FromSeconds(2));
                _mre.WaitOne();
            }
        }
    }

 

 

当输入1 时会调用 Set()方法 ManualResetEvent 处于终止状态会WaitOne不会阻塞线程会一直运行下去

当输入2时会调用 Reser()方法ManualResetEvent处于非终止状态WaitOne会阻塞线程直到再调用 Set()方法

看一下执行结果吧

<span role="heading" aria-level="2">详解 ManualResetEvent

 ManualResetEventDemo.rar

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vim中多行注释和多行删除命令「建议收藏」

    vim中多行注释和多行删除命令「建议收藏」vim中多行注释和多行删除命令这些命令也是经常用到的一些小技巧,可以大大提高工作效率。.多行注释:首先按esc进入命令行模式下,按下Ctrl+v,进入列(也叫区块)模式;在行首使用上下键选择需要注释的多行;按下键盘(大写)“I”键,进入插入模式;然后输入注释符(“//”、“#”等);最后按下“Esc”键。注:在按下esc键后,会稍等一会才会出现注释,不要着急~~时间很短的2.删除多行注释:首先按esc进入命令行模式下,按下Ctrl+v,进入列模式;选定要取消注释的多行;

    2022年6月17日
    40
  • linux eth0网卡配置详解「建议收藏」

    linux eth0网卡配置详解「建议收藏」对eth0网卡配置有两种方法,一是临时配置、二是永久配置,下面分别介绍:一、临时配置eth0的ip和子网掩码,一旦重启即失效。1.1使用ifconfig命令配置,命令如下:ifconfigeth0192.168.80.111netmask255.255.255.0配置完成后可再次使用ifconfig命令查看是否配置成功,如下…

    2022年5月30日
    256
  • 倒排索引[通俗易懂]

    倒排索引[通俗易懂]倒排索引

    2022年4月24日
    37
  • maven使用入门[通俗易懂]

    maven使用入门[通俗易懂]maven面临的问题一个项目就是一个工程。如果项目非常大,最好是每一个模块对应一个工程。借助maven可以将一个项目拆分成多个工程项目中需要的jar必须要手动”复制”,”粘贴”到WEB-INF/lib目录下,带来的问题是:同样的jar包文件重复出现在不同的项目工程中,浪费空间。maven可以将jar仅仅保存在”仓库”中,有需要使用的工程”引用”这个文件接口,并不需要真的把jar包复制过来jar包需要别人替我们准备好,或到官网下载。不同技术的官网提供jar包下载的形式是五花八门的,有些技术的官网就是

    2022年8月8日
    3
  • 精灵图

    精灵图精灵图什么是精灵图:css精灵(CSSsprites),是一种网页图片应用处理技术。主要是指将网页中需要的零星的小图片集成到一个大的图片中应用的原因:1.减少对浏览器的请求次数,避免网页的延迟2.方便小图标的统一管理精灵图的制作:1.软件:ps2.制作方法:新建透明图层添加参考线将画布划分,将小图标放入划分好的格子中精灵图的使用:css精灵图需要配…

    2022年6月10日
    36
  • 2021年G3锅炉水处理模拟试题及G3锅炉水处理模拟考试题库[通俗易懂]

    题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:N1叉车司机实操考试视频参考答案及N1叉车司机考试试题解析是安全生产模拟考试一点通题库老师及N1叉车司机操作证已考过的学员汇总,相对有效帮助N1叉车司机操作证考试学员顺利通过考试。1、【多选题】《特种设备使用管理规则》规定,特种设备安全管理制度中,包括特种设备采购、安装、()等制度。(ACD)A、改造B、销售C、修理D、报废2、【多选题】叉车工作中要保持三个距离:()。(ABC)A、叉车与…

    2022年4月16日
    38

发表回复

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

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