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

转载于:https://www.cnblogs.com/MayGarden/archive/2010/06/19/1760931.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值