zoukankan      html  css  js  c++  java
  • Monitor类示例(转)

    该类功效和lock类似:

    System.Object obj = (System.Object)x;
    System.Threading.Monitor.Enter(obj);
    try
    {
        DoSomething();
    }
    finally
    {
        System.Threading.Monitor.Exit(obj);
    }
     lock关键字比Monitor简洁,其实lock就是对MonitorEnterExit的一个封装。另外Monitor还有几个常用的方法:TryEnter能够有效的决绝长期死等的问题,如果在一个并发经常发生,而且持续时间长的环境中使用TryEnter,可以有效防止死锁或者长时间的等待。比如我们可以设置一个等待时间bool gotLock = Monitor.TryEntermyobject,1000,让当前线程在等待1000秒后根据返回的bool值来决定是否继续下面的操作。Pulse以及PulseAll还有Wait方法是成对使用的,它们能让你更精确的控制线程之间的并发,MSDN关于这3个方法的解释很含糊,有必要用一个具体的例子来说明一下:
    namespace PrintThreadSample
    {
        public class Program
        {  
            static object ball = new object();  
            public static void Main()
            {     
                Thread threadPing = new Thread( ThreadPingProc );     
                Thread threadPong = new Thread( ThreadPongProc );     
                threadPing.Start();
                threadPong.Start();    
            }  
            static void ThreadPongProc()
            {     
                  lock ( ball )        
                    for (int i = 0; i < 5; i++)
                    {           
                        System.Console.WriteLine("ThreadPong: Pong ");
                        Console.WriteLine("<=={0}", i);
                        Monitor.Pulse( ball );          
                        Monitor.Wait( ball );        
                    }     

            }  
            static void ThreadPingProc()
            {    
                 lock ( ball )        
                    for(int i=0; i< 5; i++)
                    {           
                        System.Console.WriteLine("ThreadPing: Ping ");
                        Console.WriteLine("{0}==>", i);
                        Monitor.Pulse( ball );           
                        Monitor.Wait( ball );        
                    }      
            }
        }
    }

    输出结果如下(有可能是ThreadPong先执行):

    ThreadPing: Ping
    ThreadPong: Pong
    ThreadPing: Ping
    ThreadPong: Pong
    ThreadPing: Ping
    ThreadPong: Pong
    ThreadPing: Ping
    ThreadPong: Pong
    ThreadPing: Ping
    ThreadPong: Pong
    当threadPing进程进入ThreadPingProc锁定ball并调用Monitor.Pulse( ball );后,它通知threadPong从阻塞队列进入准备队列,当threadPing调用Monitor.Wait( ball )阻塞自己后,它放弃了了对ball的锁定,所以threadPong得以执行。PulseAll与Pulse方法类似,不过它是向所有在阻塞队列中的进程发送通知信号,如果只有一个线程被阻塞,那么请使用Pulse方法。

  • 相关阅读:
    [恢]hdu 2098
    [恢]hdu 2049
    [恢]hdu 2027
    [恢]hdu 2111
    [恢]hdu 1202
    [恢]hdu 2131
    Windows Phone 7 文件下载进度和速度显示
    深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例
    深入WPF中的图像画刷(ImageBrush)之2——ImageBrush的铺设方式
    textblock设置属性
  • 原文地址:https://www.cnblogs.com/MayGarden/p/1760931.html
Copyright © 2011-2022 走看看