C# 多线程限制方法调用(monitor)

多线程执行方法 改方法没有执行完时 别的方法不能调用次方法。
用循环执行一个方法可以需要一分钟 在这一分钟只内任何 成员都不能再调用该方法。

     class MonitorSample
     {
        private int n = 1;  //生产者和消费者共同处理的数据
        private int max = 10000;

        private object monitor = new object();

        public void Produce()
         {
            lock (monitor)
             {
                for (; n <= max; n++)
                 {
                     Console.WriteLine("妈妈:第" + n.ToString() + "块蛋糕做好了");
                    //Pulse方法不用调用是因为另一个线程中用的是Wait(object,int)方法
                    //该方法使被阻止线程进入了同步对象的就绪队列
                    //是否需要脉冲激活是Wait方法一个参数和两个参数的重要区别
                    //Monitor.Pulse(monitor);
                    //调用Wait方法释放对象上的锁并阻止该线程(线程状态为WaitSleepJoin)
                    //该线程进入到同步对象的等待队列,直到其它线程调用Pulse使该线程进入到就绪队列中
                    //线程进入到就绪队列中才有条件争夺同步对象的所有权
                    //如果没有其它线程调用Pulse/PulseAll方法,该线程不可能被执行
                     Monitor.Wait(monitor);
                 }
             }
         }

        public void Consume()
         {
            lock (monitor)
             {
                while (true)
                 {
                    //通知等待队列中的线程锁定对象状态的更改,但不会释放锁
                    //接收到Pulse脉冲后,线程从同步对象的等待队列移动到就绪队列中
                    //注意:最终能获得锁的线程并不一定是得到Pulse脉冲的线程
                     Monitor.Pulse(monitor);
                    //释放对象上的锁并阻止当前线程,直到它重新获取该锁
                    //如果指定的超时间隔已过,则线程进入就绪队列
                     Monitor.Wait(monitor,1000);
                     Console.WriteLine("孩子:开始吃第" + n.ToString() + "块蛋糕");
                 }
             }
         }

        static void Main(string[] args)
         {
             MonitorSample obj = new MonitorSample();
             Thread tProduce = new Thread(new ThreadStart(obj.Produce));
             Thread tConsume = new Thread(new ThreadStart(obj.Consume));
            //Start threads.
             tProduce.Start();
             tConsume.Start();

             Console.ReadLine();
         }
     } 

Monitor的基本方法就是Pulse和Wait,Pulse是释放锁,Wait是接受并等待,配合lock使用就可以简单的实现生产者和消费者的多线程问题了

原文地址:https://www.cnblogs.com/lzgeveryday/p/4315767.html