C#多线程(二)——生产者和消费者实例

来源:互联网 发布:淘宝素材图片免费下载 编辑:程序博客网 时间:2024/05/16 10:19

 

(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函数,其中还有两个方法ThreadConsumptionThreadProduct。这两个方法是放在两个线程中进行执行的。表示一个线程进行生产,一个线程进行消费。生产线程在生产好一个物品后就通知消费者进行物品的消费,自己便停下等消费者消费完毕后通知生产线程再进行生产。具体代码如下:

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);

                }

            }

        }

    }