• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#生产者和消费者问题使用Monitor同步

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
    public class Program
    {
        static void Main(string[] args)
        {
            SyncStack ss = new SyncStack();
            Producer p = new Producer(ss);
            Consumer c = new Consumer(ss);
            new Thread(p.run).Start();
            new Thread(c.run).Start();
        }
    }
    public class Cake
    {
        int id;
        public Cake(int id)
        {
            this.id = id;
        }
        public String toString()
        {
            return "Cake" + id;
        }
    }
    public class SyncStack
    {
        int index = 0;
        Cake[] arrWT = new Cake[4];
        public void push(Cake wt)
        {
            try
            {
                Monitor.Enter(this);
                while (index == arrWT.Length)
                {
                    try
                    {

                        Console.WriteLine("已经生产满了!");
                        Monitor.Wait(this);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
                Monitor.Pulse(this);
                arrWT[index] = wt;
                index++;
            }
            finally
            {
                Monitor.Exit(this);
            }
        }
        public Cake pop()
        {
            try
            {
                Monitor.Enter(this);
                while (index == 0)
                {
                    try
                    {
                        Console.WriteLine("已经消费空了!");
                        Monitor.Wait(this);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
                Monitor.Pulse(this);
                index--;
                return arrWT[index];
            }
            finally
            {
                Monitor.Exit(this);
            }
        }
    }
    public class Producer
    {

        private bool flag = true;
        private SyncStack m_syncStack = null;
        public Producer(SyncStack ss)
        {
            this.m_syncStack = ss;
        }
        public void run()
        {
            int i = 0;
            while (flag)
            {
                Cake wt = new Cake(i);
                i++;
                m_syncStack.push(wt);
                Console.WriteLine("生产了:" + wt.toString());
            }
        }
        public void Shutdown()
        {
            flag = false;
        }
    }
    public class Consumer
    {
        private bool flag = true;
        private SyncStack m_syncStack = null;
        public Consumer(SyncStack ss)
        {
            this.m_syncStack = ss;
        }
        public void run()
        {
            while (flag)
            {

                Cake wt = m_syncStack.pop();
                Console.WriteLine("消费了:" + wt.toString());
                try
                {
                    Thread.Sleep(2000);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
        public void Shutdown()
        {
            flag = false;
        }
    }
}


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#高级参数ref的使用发布时间:2022-07-13
下一篇:
JS和C#访问遇到QueryInterface调用出错发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap