• C#多线程学习(三) 生产者和消费者


    using System;
    using System.Threading;
    public class Cell
    {
        int cellContents; // Cell对象里边的内容 
        bool readerFlag = false// 状态标志,为true时可以读取,为false则正在写入
        public int ReadFromCell()
        {
            lock (this// Lock关键字保证了什么,请大家看前面对lock的介绍 
            {
                if (!readerFlag)//如果现在不可读取    
                {
                    try
                    {
                        //等待WriteToCell方法中调用Monitor.Pulse()方法   
                        Monitor.Wait(this);
                    }
                    catch (SynchronizationLockException e)
                    {
                        Console.WriteLine(e);
                    }
                    catch (ThreadInterruptedException e)
                    {
                        Console.WriteLine(e);
                    }
                }
                Console.WriteLine("Consume: {0}", cellContents);
                readerFlag = false;                //重置readerFlag标志,表示消费行为已经完成   
                Monitor.Pulse(this);                 //通知WriteToCell()方法(该方法在另外一个线程中执行,等待中) 
            }
            return cellContents;
        }

        public void WriteToCell(int n)
        {
            lock (this)
            {
                if (readerFlag)
                {
                    try
                    {
                        Monitor.Wait(this);
                    }
                    catch (SynchronizationLockException e)
                    {
                        //当同步方法(指Monitor类除Enter之外的方法)在非同步的代码区被调用       
                        Console.WriteLine(e);
                    }
                    catch (ThreadInterruptedException e)
                    {
                        //当线程在等待状态的时候中止  
                        Console.WriteLine(e);
                    }
                }
                cellContents = n;
                Console.WriteLine("Produce: {0}", cellContents);
                readerFlag = true;
                Monitor.Pulse(this);
                //通知另外一个线程中正在等待的ReadFromCell()方法    
            }
        }

        public class CellProd
        {
            Cell cell; // 被操作的Cell对象
            int quantity = 1// 生产者生产次数,初始化为1  
            public CellProd(Cell box, int request)
            {
                //构造函数     
                cell = box;
                quantity = request;
            }
            public void ThreadRun()
            {
                for (int looper = 1; looper <= quantity; looper++)
                    cell.WriteToCell(looper); //生产者向操作对象写入信息  
            }
        }


        public class CellCons
        {
            Cell cell;
            int quantity = 1;
            public CellCons(Cell box, int request)
            {
                //构造函数   
                cell = box;
                quantity = request;
            }
            public void ThreadRun()
            {
                int valReturned;
                for (int looper = 1; looper <= quantity; looper++)
                    valReturned = cell.ReadFromCell();//消费者从操作对象中读取信息
            }
        }

        public class MonitorSample
        {
            public static void Main(String[] args)
            {
                int result = 0//一个标志位,如果是0表示程序没有出错,如果是1表明有错误发生   
                Cell cell = new Cell();         //下面使用cell初始化CellProd和CellCons两个类,生产和消费次数均为20次 
                CellProd prod = new CellProd(cell, 20);
                CellCons cons = new CellCons(cell, 20);
                Thread producer = new Thread(new ThreadStart(prod.ThreadRun));
                Thread consumer = new Thread(new ThreadStart(cons.ThreadRun));
                //生产者线程和消费者线程都已经被创建,但是没有开始执行       
                try
                {
                    producer.Start();
                    consumer.Start();
                    producer.Join();
                    consumer.Join();
                    Console.ReadLine();
                }
                catch (ThreadStateException e)
                {
                    //当线程因为所处状态的原因而不能执行被请求的操作 
                    Console.WriteLine(e);
                    result = 1;
                }
                catch (ThreadInterruptedException e)
                {
                    //当线程在等待状态的时候中止  
                    Console.WriteLine(e);
                    result = 1;
                }
                //尽管Main()函数没有返回值,但下面这条语句可以向父进程返回执行结果 
                Environment.ExitCode = result;
            }
        }
    }

    C#多线程学习(三) 生产者和消费者:http://kb.cnblogs.com/page/42530/

  • 相关阅读:
    《软件安全系统设计最佳实践》课程大纲
    《基于IPD流程的成本管理架构、方法和管理实践》培训大纲
    《技术规划与路标开发实践 》内训在芜湖天航集团成功举办!
    年终总结,究竟该写什么?
    Docker安装RabbitMQ
    Ubuntu18安装docker
    Ubuntu18.04安装MySQL
    Windows常用CMD命令
    ping不通域名的问题OR请求找不到主机-问题
    JMeter 函数用法
  • 原文地址:https://www.cnblogs.com/zhuawang/p/2246599.html
Copyright © 2020-2023  润新知