C# 生产者和消费者问题使用Monitor同步
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
public class Program
{
static void Main(string[] args)
{
SyncStack ss = new SyncStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
new Thread(p.run).Start();
new Thread(c.run).Start();
}
}
public class Cake
{
int id;
public Cake(int id)
{
this.id = id;
}
public String toString()
{
return "Cake" + id;
}
}
public class SyncStack
{
int index = 0;
Cake[] arrWT = new Cake[4];
public void push(Cake wt)
{
try
{
Monitor.Enter(this);
while (index == arrWT.Length)
{
try
{
Console.WriteLine("已经生产满了!");
Monitor.Wait(this);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Monitor.Pulse(this);
arrWT[index] = wt;
index++;
}
finally
{
Monitor.Exit(this);
}
}
public Cake pop()
{
try
{
Monitor.Enter(this);
while (index == 0)
{
try
{
Console.WriteLine("已经消费空了!");
Monitor.Wait(this);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Monitor.Pulse(this);
index--;
return arrWT[index];
}
finally
{
Monitor.Exit(this);
}
}
}
public class Producer
{
private bool flag = true;
private SyncStack m_syncStack = null;
public Producer(SyncStack ss)
{
this.m_syncStack = ss;
}
public void run()
{
int i = 0;
while (flag)
{
Cake wt = new Cake(i);
i++;
m_syncStack.push(wt);
Console.WriteLine("生产了:" + wt.toString());
}
}
public void Shutdown()
{
flag = false;
}
}
public class Consumer
{
private bool flag = true;
private SyncStack m_syncStack = null;
public Consumer(SyncStack ss)
{
this.m_syncStack = ss;
}
public void run()
{
while (flag)
{
Cake wt = m_syncStack.pop();
Console.WriteLine("消费了:" + wt.toString());
try
{
Thread.Sleep(2000);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
public void Shutdown()
{
flag = false;
}
}
}