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方法。

posted on 2010-06-19 15:25  Acor  阅读(492)  评论(1编辑  收藏  举报

导航