多线程编程之生产者和消费者之间的问题

前段时间没事研究了一些生产者和消费者之间的问题,期间也查看了不少资料。又重新有了新的认识。特别作为一个IT农民工,必须要掌握的技能啊。

个人理解,这个应该说是一种模型吧,学会它,可以应用到多个方面的技术上去。数据流文件的读写,程序中的数据缓冲技术,播放缓冲技术等等。

废话不多说。。。直接上代码。下面是个C# 写的代码。比较粗糙,请谅解,有问题大家可以一起讨论研究。

 1 using System;
 2 using System.Threading;
 3
 4 namespace Consumer
 5 {
 6     /// <summary>
 7     /// </summary>
 8     /// 用数组控制缓冲区,需要自己定义控制读取的位置
 9     public class BufferInArray
10     {
11         public const int BufferSize = 20;
12         public const int Max = 1000;
13         private int[] buffer = new int[BufferSize];
14
15         private int bufferCount = 0;
16
17         private int readLocation = 0, writeLocation = 0;
18
19         public int GetBuffer()
20         {
21             lock (this)
22             {
23                 if (bufferCount == 0)
24                 {
25                     Monitor.Wait(this);
26                 }
27                 int readValue = buffer[readLocation];
28                 bufferCount--;
29                 readLocation = (readLocation + 1) % buffer.Length;
30                 Monitor.Pulse(this);
31                 return readValue;
32             }
33         }
34
35         public void SetBuffer(int writeValue)
36         {
37             lock (this)
38             {
39                 if (bufferCount ==BufferSize)
40                 {
41                     Monitor.Wait(this);
42                 }
43                 buffer[writeLocation] = writeValue;
44                 bufferCount++;
45                 writeLocation = (writeLocation + 1) % buffer.Length;
46                 Monitor.Pulse(this);
47             }
48         }
49     }
50
51     public class Producer
52     {
53         BufferInArray shared;
54
55         public Producer(BufferInArray sharedLocation)
56         {
57             shared = sharedLocation;
58         }
59
60         public void produce()
61         {
62             for (int count = 1; count <= BufferInArray.Max; count++)
63             {
64                 shared.SetBuffer(count);
65             }
66         }
67     }
68
69     public class Consumer
70     {
71         private int value;
72         BufferInArray shared;
73
74         public Consumer(BufferInArray sharedLocation)
75         {
76             shared = sharedLocation;
77         }
78
79         public void consume()
80         {
81             for (int count = 1; count <= BufferInArray.Max; count++)
82             {
83                 value = shared.GetBuffer();
84             }
85         }
86     }
87 }

这个Demo是用的单缓冲数组技术。后续我还有双缓冲,环形缓冲等等。。。。

时间: 2024-07-30 10:17:29

多线程编程之生产者和消费者之间的问题的相关文章

Java多线程设计模式(2)生产者与消费者模式

1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不匹配. 当要从某个线程Produccer参与者将数据传输给其它线程Consumer参与者的时候,此时就可以在中间加一个Channel参与者,在Channel参与者中以某种方式存放接受的数据,再以某方式来获取收到的数据,Channel就可以来缓存两个线程之间传输的数据,在Channel参与者为了保证安

多线程编程之生产者消费者问题

生产者-消费者问题(Producer-consumer problem),也称作有限缓冲问题(Bounded-buffer problem),是多线程领域的一个经典问题,可以描述为:两个或者更多个线程共享同一个缓冲区,其中一个或多个作为“生产者”会不断地向缓冲区中添加数据,另外的一个或者多个作为“消费者”从缓冲区中取走数据.这个问题的关键在于:要保证缓冲区满了之后“生产者”不能再继续添加数据,而缓冲区空了之后“消费者”不能再取走数据了. 这个问题在多个“生产者”和“消费者”的情况下肯定要麻烦一点

Linux多线程机制(生产者和消费者实例 )

    使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.我们知道,在Linux系统下,启动一个新的进程必须分配给它独立 的地址空间,建立众多的数据表来维护它的代码段.堆栈段和数据段,这是一种"昂贵"的多任务工作方式.而运行于一个进程中的多个线程,它们彼此之间使用相 同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要 的时间. 使用多线程的理由之二是线

多线程操作实例——生产者与消费者

面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者——设置信息名字name,和内容content 消费者——负责取出设置的信息. 一.基本实现 由于线程的不确定性可能出现以下问题: (1)消费者取出的信息不匹配,即不是由同一个生产者设置的信息 (2)生产者生产了多个信息,消费者才开始取出信息,或消费者取出的重复的信息. 上面的问题下面会逐一解决,下面

java多线程中的生产者与消费者之等待唤醒机制@Version1.0

一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notifyAll():唤醒所有线程2.为什么这些方法不定义在Thread类中呢?  这些方法的调用必须通过锁对象调用,而我们刚才使用的锁对象是任意锁对象.  所以,这些方法必须定义在Object类中.3.当我们在使用多线程的时候有的时候需要,一条线程产生一个数据,另一条线程接着消费一个数据,一边生产一边消费,

Java多线程与并发——生产者与消费者应用案例

多线程的开发中有一个最经典的操作案例,就是生产者-消费者,生产者不断生产产品,消费者不断取走产品. package com.vince; /** * 生产者与消费者案例 * @author Administrator * */ public class ThreadDemo4 { public static void main(String[] args) { // TODO 自动生成的方法存根 Food food=new Food(); Producter p=new Producter(fo

并发协作:多线程中的生产者与消费者模型

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一样,Hello World!都是最经典的例子. 实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了. 对于此模型,应该明确一下几点: 1.生产者仅仅在仓储未满时候生产,仓满则停止生产. 2.消费者仅仅在仓储有产品时候才能消费,仓空则等待. 3.当消费者发现仓储没产品可消费时候会通知生产者生产. 4.生产者在生产出可消费产品时候,应该通知等待的消费者去消费.

多线程_多生产者多消费者的实现问题

多生产者多消费者是Java中的一个经典的案例,采用等待唤醒机制来实现,代码如下: public class ProducerConsumer { public static void main(String[] args) { Resource res=new Resource(); Producer pro1=new Producer(res); Producer pro2=new Producer(res); Consumer con1=new Consumer(res); Consumer

多线程----简单的生产者和消费者

package cn.zz; //简单的生产者和消费者class Resource { private String name; private int count; private boolean flag = false; public synchronized void Set(String name) { if (flag) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated cat