详解 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 登存拍网站_京东待审核服务单怎么处理

    登存拍网站_京东待审核服务单怎么处理1.注册打开“留拍”软件,进入主页面,然后按注册按钮:在注册页面什么内容都没有写上去的情况下,按完成按钮:首先把URL封装起来:publicclassURL{publicfinal

    2022年8月2日
    8
  • zookeeper入门教程_ZooKeeper的事件机制原理

    zookeeper入门教程_ZooKeeper的事件机制原理zookeeperwatcher架构zookeeper 配置中心分布式ID分布式锁集群搭建数据一致性协议:zab协议Zookeeper Leader选举Observer角色及其配置watcher架构客户端首先将Watcher注册到服务器,同时将Watch对象保存到客户端的Watch管理器中。当Zookeeper服务器监听到的数据发生变化时,服务器会通知客户端,接着客户端的Watch管理器会触发相关的Watcher来回调响应处理逻辑,从而完成整体的数据发布/订阅流程。javaAPIJava

    2022年8月9日
    6
  • 计算机插了网线缺连不了网络,网线连不上网怎么回事_为什么网线插电脑上不了网-win7之家…

    计算机插了网线缺连不了网络,网线连不上网怎么回事_为什么网线插电脑上不了网-win7之家…当我们在使用有线网络的时候,都需要在电脑中插入网线才可以,但是有不少用户却遇到网线连不上网的情况,为什么网线插电脑上不了网呢?导致这样问题的原因有很多,为了帮助到大家,现在给大家讲解一下网线连不上网的几种解决方法,一起来看看吧。具体步骤如下:1、电脑插上网线却连不上网首先可能是网线接触不良导致的,可以将网线的两端拔下来重新连接再试试看能不能连上网,或者查看一下网线有无破损,将网线放在其他电脑上连接…

    2022年6月26日
    41
  • docker部署web项目_docker构建高可用web应用

    docker部署web项目_docker构建高可用web应用前言前面我们运行的容器并没有一些什么特别的用处。接下来让我们尝试使用docker构建一个web应用程序。我们将在docker容器中运行一个PythonFlask应用来运行一个web

    2022年7月30日
    4
  • display:flex垂直居中

    display:flex垂直居中布局说明:1.场次为一场比赛     2.比赛双方是交战的两个队伍        3.一场比赛可以有多种玩法,所以场的每个玩法的布局的高度都不确定。主要说下我学到的垂直居中的flex。1.第一次尝试。1divclass=”parent”>2h1>我是通过flex的水平垂直居中噢h1>3h1>我是通过fl

    2022年6月14日
    68

发表回复

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

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