
代码
class MonitorSample
{
const int MAX_LOOP_TIME = 5;
Queue m_smplQueue;
public MonitorSample()
{
m_smplQueue = new Queue();
}
public void FirstThread()
{
int counter = 0;
lock (m_smplQueue)
{
while (counter < MAX_LOOP_TIME)
{
Console.WriteLine("FirstThread 1 Wait() 前");
Monitor.Wait(m_smplQueue);
Console.WriteLine("FirstThread 2 Wait() 后");
m_smplQueue.Enqueue(counter);
Console.WriteLine("FirstThread 3 Pulse() 前");
Monitor.Pulse(m_smplQueue);
Console.WriteLine("FirstThread 4 Pulse() 后");
counter++;
Console.WriteLine("FirstThread 5 Pulse() 后 counter={0}", counter);
}
}
}
public void SecondThread()
{
lock (m_smplQueue)
{
Console.WriteLine("SecondThread 1 Pulse() 前");
Monitor.Pulse(m_smplQueue);
Console.WriteLine("SecondThread 2 Pulse() 后");
Console.WriteLine("SecondThread 3 Wait() 前");
while (Monitor.Wait(m_smplQueue, 1000))
{
Console.WriteLine("SecondThread 4 Wait() 后");
int counter = (int)m_smplQueue.Dequeue();
Console.WriteLine("SecondThread 5 Pulse() 前");
Monitor.Pulse(m_smplQueue);
Console.WriteLine("SecondThread 6 Pulse() 后");
}
}
}
public int GetQueueCount()
{
return m_smplQueue.Count;
}
static void Main(string[] args)
{
MonitorSample test = new MonitorSample();
Thread tFirst = new Thread(new ThreadStart(test.FirstThread));
Thread tSecond = new Thread(new ThreadStart(test.SecondThread));
tFirst.Start();
tSecond.Start();
tFirst.Join();
tSecond.Join();
Console.WriteLine("Queue Count = " + test.GetQueueCount().ToString());
Console.ReadKey();
}
}