zoukankan      html  css  js  c++  java
  • 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使用就可以简单的实现生产者和消费者的多线程问题了

  • 相关阅读:
    【Android开发艺术探索】Activity的生命周期和启动模式
    【Android】基于WanAndroid开放API实现的文章阅读APP
    【Android】天气应用
    【Android】动态更新Icon
    【Android】VirtualAPK的简单使用
    Android数据存储之SD卡文件操作
    Android数据存储之SQLite数据库
    Android数据存储之共享参数SharedPreferences
    tensor维度变换
    tensor数据基操----索引与切片
  • 原文地址:https://www.cnblogs.com/lzgeveryday/p/4315767.html
Copyright © 2011-2022 走看看