zoukankan      html  css  js  c++  java
  • 生产消费生产消费模型

    原始地址: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);
    
    }
    
    }
    
    }
    
    }
  • 相关阅读:
    BFS模版程序
    7.3 GROUP BY的“新”功能
    《ASP.NET》数据绑定—DropDownList、ListBox
    GPS NEMA 0183协议
    使用Microsoft.Office.Interop.Excel时,64位问题
    HDU 1848(sg博弈) Fibonacci again and again
    Codeforces 559A Gerald&#39;s Hexagon 数三角形
    移动mm 话费支付接入过程(ane)
    Android怎样实现毛玻璃效果之Android高级模糊技术
    ECLIPSE android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
  • 原文地址:https://www.cnblogs.com/i80386/p/2224833.html
Copyright © 2011-2022 走看看