//from
//http://www.microsoft.com/china/community/Column/94.mspxclass MonitorSample
{
private Queue _queue = new Queue();
public void Producer()
{
int counter = 0;
lock( _queue )//判断该资源是否被其他线程占用
{
while( counter < 2 )
{
Monitor.Wait( _queue );//暂时放弃调用线程对该资源的锁,让Consumer执行
_queue.Enqueue( counter );//生成一个资源
Console.WriteLine( String.Format( "生产:{0}", counter ) );
Monitor.Pulse( _queue );//通知在Wait中阻塞的Consumer线程即将执行
counter++;
}
}
}
public void Consumer()
{
lock( _queue )
{
Monitor.Pulse( _queue );//通知在Wait中阻塞的Producer线程即将执行
while( Monitor.Wait( _queue, 10 ) )
{
int counter = ( int ) _queue.Dequeue();//取出一个资源
Console.WriteLine( String.Format( "消费:{0}", counter ) );
Monitor.Pulse( _queue );//通知在Wait中阻塞的Producer线程即将执行
}
}
}
static void Main(string[] args)
{
MonitorSample monitor = new MonitorSample();            
Thread producer = new Thread( new ThreadStart( monitor.Producer ) );
Thread consumer = new Thread( new ThreadStart( monitor.Consumer ) );
producer.Start();
consumer.Start();
producer.Join();
consumer.Join();            
Console.ReadLine();
}
}