原始地址:http://blog.csdn.net/shellwin/article/details/5868760
(1) Consumer表示消费类,其中定义了一个ArrayList表示容器,容器中装的是Goods这个类的对象。主要是方法Consumption,这个是表示消费的方法。具体代码如下:
public class Consumer { ArrayList container = null; //得到一个容器 public Consumer(ArrayList container) { this.container = container; } //定义一个消费的方法 public void Consumption() { Goods goods = (Goods)this.container[0]; Console.WriteLine("消费了物品:" + goods.ToString()); //消费掉容器中的一个物品 this.container.RemoveAt(0); } }
(2) Producer表示生产类,同样有一个ArrayList表示容器,和Consumer类一样有一个得到容器的构造函数。主要方法是Product,表示生产一个物品的方法,具体代码如下:
public class Producer { ArrayList container = null; //得到一个容器 public Producer(ArrayList container) { this.container = container; } //定义一个生产物品的方法装入容器 public void Product(string name) { //创建一个新物品装入容器 Goods goods = new Goods(); goods.Name = name; this.container.Add(goods); Console.WriteLine("生产了物品:" + goods.ToString()); } }
(3) 接下来看看物品类Goods,这个表示生产者和消费者进行交互的物品,其中就一个属性Name表示名称,同时重写了ToString()方法。具体代码如下:
public class Goods { //物品名称 private string name; public string Name { get { return name; } set { name = value; } } //重写ToString() public override string ToString() { return "物品名称:" + name; } }
(4) 最后看看我们的Programe类,这个类包含了一个启动的Main函数,其中还有两个方法ThreadConsumption和ThreadProduct。这两个方法是放在两个线程中进行执行的。表示一个线程进行生产,一个线程进行消费。生产线程在生产好一个物品后就通知消费者进行物品的消费,自己便停下等消费者消费完毕后通知生产线程再进行生产。具体代码如下:
class Program { //创建一个消费者和生产者共用的一个容器 ArrayList container = new ArrayList(); Producer producer = null; Consumer consumer = null; static void Main(string[] args) { Program p = new Program(); //创建两个线程并启动 Thread t1 = new Thread(new ThreadStart(p.ThreadProduct)); Thread t2 = new Thread(new ThreadStart(p.ThreadConsumption)); t1.Start(); t2.Start(); Console.Read(); } //定义一个线程方法生产8个物品 public void ThreadProduct() { //创建一个生产者 producer = new Producer(this.container); lock (this) { for (int i = 1; i <= 8; i++) { //如果容器中没有就进行生产 if (this.container.Count == 0) { //调用方法进行生产 producer.Product(i + ""); //生产好了一个通知消费者消费 Monitor.Pulse(this); } //容器中还有物品等待消费者消费后再生产 Monitor.Wait(this); } } } //定义一个线程方法消费生产的物品 public void ThreadConsumption() { //创建一个消费者 consumer = new Consumer(this.container); lock (this) { while (true) { //如果容器中有商品就进行消费 if (this.container.Count != 0) { //调用方法进行消费 consumer.Consumption(); Monitor.Pulse(this); } //容器中没有商品通知消费者消费 Monitor.Wait(this); } } } }