生产-消费-生产-消费模型

本文介绍了一种使用消费者与生产者模式来实现简单物品的生产和消费过程,通过创建消费者类、生产者类和物品类,展示了如何在多线程环境下同步物品的生产和消费。详细阐述了每个类的作用、关键方法实现以及如何通过线程间的协作完成物品的循环生产和消费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原始地址:http://blog.youkuaiyun.com/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);

}

}

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值