`

生产者消费者模式

阅读更多

 生产者消费者 环形缓冲模式

 ---------------------------------------------------------

/**

 * 环形缓冲区

 * @author fengbin

 *

 */

public class CircularBuf {

 

   int NMAX = 1000;

 

   int iput = 0; // 环形缓冲区的当前放人位置

 

   int iget = 0; // 缓冲区的当前取出位置

 

   int n = 0; // 环形缓冲区中的元素总数量

 

   Object buffer[];

   

   public CircularBuf() {

       super();

       buffer = new Object[NMAX];

   }

 

   public CircularBuf(int nmax) {

       super();

       NMAX = nmax;

       buffer = new Object[NMAX];

   }

 

   /*

    * 环形缓冲区的地址编号计算函数,,如果到达唤醒缓冲区的尾部,将绕回到头部。

    * 

    * 环形缓冲区的有效地址编号为:0到(NMAX-1)

    * 

    */

   public synchronized int addring(int i) {

       return (i + 1) == NMAX ? 0 : i + 1;

   }

 

   /* 从环形缓冲区中取一个元素 */

   public synchronized Object get() {

       int pos;

       

        System.out.println("------------数量:"+n);

       

           if (n > 0) {

           

               pos = iget;

               iget = addring(iget);

               n--;

               // System.out.println("get-->" + buffer[pos]);

               notifyAll();

               return buffer[pos];

 

           } else {

               // System.out.println("Buffer is Empty");

               try {

                   wait();

               } catch (InterruptedException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

               }

 

           }

       return null;

 

   }

 

   /* 向环形缓冲区中放人一个元素 */

   public synchronized void put(Object z) {

 

           if (n < NMAX) {

               buffer[iput] = z;

               

               System.out.println("put<--" + buffer[iput]);

               

               iput = addring(iput);

               n++;

               notifyAll();

           } else {

                System.out.println("Buffer is full");

               try {

                   wait();

                   put(z);//如果满了后,重新执行

                   System.out.println("rerun !");

               } catch (InterruptedException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

               }

           }

 

   }

 

}

 

 

-----------------------------------------------------------------

 

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

 

import org.apache.commons.lang.StringUtils;

 

/**

 * 环形缓冲区 测试

 * @author fengbin

 *

 */

public class CircularBufTest {

 

 

CircularBuf circularBuf = new CircularBuf(2);

 

class Producer implements Runnable{

 

String apple = "";

Producer(String str){

apple = str;

}

 

@Override

public void run() {

for(int j=0;j<5;j++){

circularBuf.put(apple+j);

System.out.println("!生产:"+apple+j+"结束");

}

 

}

}

 

class Consumer implements Runnable{

 

Consumer(){

}

 

@Override

public void run() {

while(true){

String str=(String) circularBuf.get();

if(StringUtils.isEmpty(str)){

continue;

}

System.out.println("#消费:"+str+"结束");

 

try {

Thread.sleep(500);

} catch (Exception e) {

System.out.println(e);

}

}

}

 

 

}

 

public void test() {

 

ExecutorService service = Executors.newCachedThreadPool();

Producer producer = new Producer("P");

Consumer consumer = new Consumer();

service.submit(producer);

service.submit(consumer);

}

 

 

 

public static void main(String[] args) {

 

CircularBufTest test = new CircularBufTest();

test.test();

 

}

 

}

 =================================================

使用阻塞队列实现的生产者和消费者模式.

 

public class TestProducterConsumer {

 

class Producter extends Thread {

Queue q;

 

Producter(Queue q) {

this.q = q;

}

 

public void run() {

for (int i = 0; i < 10; i++) {

q.put(i);

System.out.println("producter :" + i);

}

}

}

 

class Consumer extends Thread{

Queue q;

Consumer(Queue q) {

this.q = q;

}

 

public void run() {

while (true) {

System.out.println("Consumer:" + q.get());

}

}

}

 

class Queue {

int value;

boolean bFull = false;

 

public synchronized void put(int i) {

if (!bFull) {

value = i;

bFull = true;

notify();// 必须用在synchronized

}

try {

wait();// 必须捕获异常

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

public synchronized int get() {

if (!bFull)

try {

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

bFull = false;

notify();

return value;

}

 

}

 

public static void main(String[] args) {

TestProducterConsumer con = new TestProducterConsumer();

con.test();

 

}

 

private void test() {

Queue q = new Queue();

Producter p = new Producter(q);

Consumer c = new Consumer(q);

p.start();

c.start();

}

 

}

 

分享到:
评论

相关推荐

    生产者 消费者 模式 c++

    生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...

    labview 基于事件的生产者消费者模式

    labview 基于事件的生产者消费者模式

    java 多线程 生产者消费者模式

    Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...

    redis 老版本生产者消费者模式

    在早期版本中,Redis 提供了一种基于队列的数据结构来实现生产者消费者模式,这是一种多线程或分布式系统中常见的设计模式,用于解耦数据生成(生产者)与数据处理(消费者)的过程。 生产者消费者模式在 Redis 中...

    架构设计 生产者消费者模式

    在软件工程的诸多设计模式中,生产者消费者模式无疑占据着重要的位置。它是一种通过解耦合生产与消费过程,增强系统并发处理能力和解决不同处理速率问题的架构模式。生产者消费者模式的构建可以实现系统的高内聚和低...

    Java 生产者消费者模式

    在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...

    Linux 多线程实现生产者消费者模式.pdf

    Linux多线程实现生产者消费者模式涉及到操作系统中的多个重要知识点,包括多线程编程、生产者消费者模型、互斥量、条件变量等。在Linux环境下,这些功能可以通过POSIX线程(pthread)库来实现。下面详细解释这些知识...

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    Qt C++11 生产者消费者模式类

    生产者消费者模式是一种多线程同步的经典设计模式,它在多线程编程中扮演着重要的角色,用于协调生产数据和消费数据的两个并发过程。在本项目“Qt C++11 生产者消费者模式类”中,我们看到利用Qt框架和C++11的新特性...

    多进程同步-生产者消费者模式-C实现

    在这个场景下,我们关注的是一个经典的并发编程模型——生产者消费者模式。该模式是多进程同步的一种典型应用,通过它我们可以高效地管理数据的生产和消费。 生产者消费者模式基于操作系统提供的信号量(Semaphore...

    java 多线程 生产者消费者模式源码

    java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...

    生产者消费者模式在java中的应用

    生产者消费者模式是一种经典的多线程同步问题解决方案,在Java中有着广泛的应用。它主要用于解决系统中数据处理的并发问题,确保生产者线程与消费者线程之间的协作与数据的有序处理。这种模式遵循一个基本原理:生产...

    界面话模拟生产者消费者模式java

    生产者消费者模式是一种经典的多线程同步问题,用于在并发环境中协调生产者和消费者之间的数据处理。在这个模式中,生产者负责生成数据,而消费者则负责处理这些数据。Java提供了丰富的并发工具,如`BlockingQueue`...

    多线程生产者消费者模式

    生产者消费者模式是一种经典的多线程设计模式,它用于协调两个或多个线程之间的数据交换,确保数据的正确生产和消费。 生产者消费者模式的核心思想是通过共享缓冲区来实现线程间的通信。生产者线程负责生成数据并放...

    java生产者消费者模式

    【生产者消费者模式】是一种经典的多线程设计模式,用于解决资源的共享和并发访问问题。在该模式中,生产者负责创建产品并放入共享的缓冲区,而消费者则从缓冲区取出产品进行消费。这种模式的核心是确保生产者与消费...

    生产者消费者模式+定时任务demo

    生产者消费者模式是一种多线程设计模式,它用于解决生产数据和消费数据的同步问题,以避免生产者过快生产导致资源浪费,或者消费者过快消费导致无数据可处理的情况。这种模式通常由两个主要角色构成:生产者...

    LabView图形化编程语言之生产者消费者架构串口数据高速采集.zip

    在“LabView图形化编程语言之生产者消费者架构串口数据高速采集”这个主题中,我们将深入探讨如何使用LabView来构建高效的数据采集系统,特别是涉及到串口通信和生产者消费者模式。 首先,让我们理解生产者消费者...

    生产者和消费者模式多线程

    创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue&lt;String&gt; queue; public Producer(BlockingQueue&lt;String&gt; queue) { this....

Global site tag (gtag.js) - Google Analytics