下面定义生产者类 CellProd 和消费者类 CellCons ,它们都只有一个方法ThreadRun(),以便在Main()函数中提供给线程的ThreadStart代理对象,作为线程的入口。

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( );//消费者从操作对象中读取信息
       }
}

然后在下面这个类MonitorSample的Main()函数中,我们要做的就是创建两个线程分别作为生产者和消费者,使用CellProd.ThreadRun()方法和CellCons.ThreadRun()方法对同一个Cell对象进行操作。

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

在上面的例程中,同步是通过等待Monitor.Pulse()来完成的。首先生产者生产了一个值,而同一时刻消费者处于等待状态,直到收到生产者的“脉冲(Pulse)”通知它生产已经完成,此后消费者进入消费状态,而生产者开始等待消费者完成操作后将调用Monitor.Pulese()发出的“脉冲”。

它的执行结果很简单:

Produce: 1
Consume: 1
Produce: 2
Consume: 2
Produce: 3
Consume: 3
...
...
Produce: 20
Consume: 20

事实上,这个简单的例子已经帮助我们解决了多线程应用程序中可能出现的大问题,只要领悟了解决线程间冲突的基本方法,很容易把它应用到比较复杂的程序中去。

C#多线程学习(三) 生产者和消费者 2相关推荐

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

    C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...

  2. C#多线程学习(三) 生产者和消费者 (转载系列)——继续搜索引擎研究

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  3. [转]C#多线程学习(三) 生产者和消费者

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  4. C#多线程学习(三) 生产者和消费者 1——解决线程间冲突的关键

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  5. Java多线程学习三:有哪几种实现生产者消费者模式的方法

    我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦.消息队列等场景.在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时 ...

  6. java多线程生产者与消费者案例_多线程操作实例——生产者与消费者

    面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者- ...

  7. Python爬虫的经典多线程方式,生产者与消费者模型

    在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我们需要感知线程之间的状态,交换线程之间的信息是一件非常复杂和困难的事情.因为我们没有更高级的系统权限,也没有上帝视角,很难知道目前运行的状态 ...

  8. Java学习笔记—生产者和消费者模式

    一.生产者和消费者问题 生产者消费者模式是一个十分经典的多线程协作的模式. 生产者和消费者问题包含了两类线程:一类是生产者线程用于生产数据, 一类是消费者数据用于消费数据. /*生产者消费者案例 包含 ...

  9. 基于java多线程来实现生产者和消费者的实例

    声明:本实例是在网上看到,做了很小的修改.所以感谢之前的作者.只是一时忘了哪儿看到,没法加入链接,向原作者道歉,以示尊重.抱歉-^)... 同步栈: 1 class SycnStack { 2 pri ...

最新文章

  1. 沈向洋:读论文的三个层次
  2. java 动态数组的应用
  3. Java集合,ConcurrentHashMap底层实现和原理(常用于并发编程)
  4. CSS实现英文或拼音单词首字母大写
  5. 涂鸦智能 dubbo-go 亿级流量的实践与探索
  6. 网易云音乐:基于分布式图学习的推荐系统优化之路
  7. (转)Android ViewGroup的onInterceptTouchEvent()事件分析
  8. P6835-[Cnoi2020]线形生物【期望dp】
  9. python删除txt指定内容_正则表达式使用python从文件中过滤和删除特定的多行文本...
  10. Linux下的硬件驱动——USB设备(下)
  11. 【Xilinx-Petalinux学习】-02-建立PetaLinux工程
  12. 怎么让plsqldev恢复界面视图复位
  13. 英文分词的算法和原理
  14. ACR122U Android端应用开发入道指南
  15. HW-LCD-070 7寸液晶屏 数据手册
  16. SAP国际商品编码(EAN码)允许前导0增强
  17. java枚举类型学习笔记
  18. 梁漱溟:人生的三种态度 | 合道的生活
  19. python 图片抓取
  20. Welearn的cookie值怎么获取?

热门文章

  1. 洛谷——P1150 Peter的烟
  2. JavaScript中的数字型
  3. ArrayList 类方法toArray的一点疑惑
  4. 2021-03-06JAVA大数据Week1
  5. CentOS搭建Git服务器
  6. Linux命令解释之chmod
  7. 【编译原理笔记11】中间代码生成:类型表达式,声明语句的翻译
  8. 【李宏毅2020 ML/DL】P73 More about Anomaly Detection
  9. index.php上传到服务器找不到站点,ThinkPHP上传到服务器出现404,未找到index.php模板等问题...
  10. android 开发 目标绑定,Hippy: Hippy 是一个新生的跨端开发框架,目标是使开发者可以只写一套代码就直接运行于三个平台(iOS、Android 和 Web)...