C# 多线程 生产者 消费者

想写一个程序,关于生产者和消费者,请高手指点下该如何实现?生产者每次生产一件商品放到商品容器中,消费者每次从商品容器中消费一件商品。程序启动后:1、商品容器中有初始的10... 想写一个程序,关于生产者和消费者,请高手指点下该如何实现?
生产者每次生产一件商品放到商品容器中,消费者每次从商品容器中消费一件商品。
程序启动后:
1、商品容器中有初始的10件商品,
2、生产者线程开始生产商品,生产完5件商品后停止,
3、同时消费者线程开始消费商品,如果商品容器中剩余商品只剩下8件了就不再继续消费了,
4、生产的时候不能消费,消费的时候不能生产(类似与读一个文件的时候不能写入,只有写完后才能开始读取)

这里有一个例子,但不能满足第3条,可以在他的基础上稍作修改
http://blog.sina.com.cn/s/blog_4ca200e20100oi10.html
展开
 我来答
syht2000
高粉答主

推荐于2016-12-06 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部
class Program
{
    AutoResetEvent are_producer = new AutoResetEvent(false);//生产者启动标记
    ManualResetEvent are_consumer = new ManualResetEvent(false);//消费者启动标记
    Random rnd = new Random();
    List<int> list = new List<int>();
    void init()//初始化
    {
        for (int i = 0; i < 10; i++)
        {
            int r = rnd.Next(1, 100);
            list.Add(r);
            Console.WriteLine("容器初始化,添加" + r);
        }
        Console.WriteLine("容器初始化完成,元素数" + list.Count);
    }
    void producer()
    {
        while (true)
        {
            are_producer.WaitOne();//等待生产开始                
            for (int i = 0; i < 5; i++)
            {
                int r = rnd.Next(1, 100);
                list.Add(r);
                Console.WriteLine("生产者生产了" + r);
            }
            Console.WriteLine("生产完成,总元素数量" + list.Count);
            Thread.Sleep(1000);
            are_consumer.Set();//通知开始消费
        }
    }
    void consumer()
    {
        while (true)
        {
            are_consumer.WaitOne();//等待消费开始
            int r = list[0];
            list.RemoveAt(0);
            Console.WriteLine("消费者消费了{0},剩余元素{1}个", r, list.Count);
            if (list.Count <= 8)
            {
                are_consumer.Reset();//停止消费
                are_producer.Set();//开始生产
            }
            Thread.Sleep(1000);
        }
    }
static void Main(string[] args)
    {
        Program prg = new Program();
        prg.init();
        (new Thread(new ThreadStart(prg.producer))).Start();
        (new Thread(new ThreadStart(prg.consumer))).Start();
        prg.are_producer.Set();//开始生产
        Console.ReadKey();
    }
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式