`
fishyu0817
  • 浏览: 111163 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java设计模式之生产者消费者模式

阅读更多

转载

 

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一 样,Hello World!都是最经典的例子。

  实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。

  对于此模型,应该明确一下几点:

  1、生产者仅仅在仓储未满时候生产,仓满则停止生产。

  2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。

  3、当消费者发现仓储没产品可消费时候会通知生产者生产。

  4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。

  此模型将要结合java.lang.Object的wait与notify、notifyAll方法来实现以上的需求。这是非常重要的。


   /**
   * Java线程:并发协作-生产者消费者模型
  *
   * @author leizhimin 2009-11-4 14:54:36
  */
   public class Test {
  public static void main(String[] args) {
   Godown godown = new Godown(30);
   Consumer c1 = new Consumer(50, godown);
   Consumer c2 = new Consumer(20, godown);
   Consumer c3 = new Consumer(30, godown);
   Producer p1 = new Producer(10, godown);
   Producer p2 = new Producer(10, godown);
   Producer p3 = new Producer(10, godown);
   Producer p4 = new Producer(10, godown);
   Producer p5 = new Producer(10, godown);
   Producer p6 = new Producer(10, godown);
   Producer p7 = new Producer(80, godown);
  c1.start();
   c2.start();
  c3.start();
  p1.start();
  p2.start();
   p3.start();
  p4.start();
  p5.start();
  p6.start();
   p7.start();
  }
  }
  /**
  * 仓库
  */
   class Godown {
  public static final int max_size = 100; //最大库存量
   public int curnum; //当前库存量
  Godown() {
  }
   Godown(int curnum) {
  this.curnum = curnum;
  }
  /**
   * 生产指定数量的产品
  *
  * @param neednum
  */
   public synchronized void produce(int neednum) {
  //测试是否需要生产
   while (neednum + curnum > max_size) {
  System.out.println("要生产的产 品数量" + neednum + "超过剩余库存量" + (max_size - curnum) + ",暂时不能执行生产任务!");
   try {
  //当前的生产线程等待
  wait();
   } catch (InterruptedException e) {
  e.printStackTrace();
  }
   }
  //满足生产条件,则进行生产,这里简单的更改当前库存量
  curnum += neednum;
   System.out.println("已经生产了" + neednum + "个产品,现仓储量为" + curnum);
  //唤醒 在此对象监视器上等待的所有线程
  notifyAll();
  }
  /**
  * 消费指定数量的产品
   *
  * @param neednum
  */
   public synchronized void consume(int neednum) {
  //测试是否可消费
   while (curnum < neednum) {
  try {
  //当前的生产线程等待
   wait();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  }
  //满足消费条件,则进行消费,这里简单的更改当前库存量
   curnum -= neednum;
  System.out.println("已经消费了" + neednum + "个产品,现仓 储量为" + curnum);
  //唤醒在此对象监视器上等待的所有线程
  notifyAll();
  }
   }
  /**
  * 生产者
  */
  class Producer extends Thread {
   private int neednum; //生产产品的数量
  private Godown godown; //仓库
   Producer(int neednum, Godown godown) {
  this.neednum = neednum;
   this.godown = godown;
  }
  public void run() {
  //生产指定数量的 产品
  godown.produce(neednum);
  }
  }
  /**
  * 消费者
   */
  class Consumer extends Thread {
  private int neednum; //生 产产品的数量
  private Godown godown; //仓库
   Consumer(int neednum, Godown godown) {
  this.neednum = neednum;
   this.godown = godown;
  }
  public void run() {
  //消费指定数量的 产品
  godown.consume(neednum);
  }
  }

 


   已经生产了10个产品,现仓储量为40
  已经生产了10个产品,现仓储量为50
  已经消费了50个产品,现仓储量为0
   已经生产了80个产品,现仓储量为80
  已经消费了30个产品,现仓储量为50
  已经生产了10个产品,现仓储量为60
   已经消费了20个产品,现仓储量为40
  已经生产了10个产品,现仓储量为50
  已经生产了10个产品,现仓储量为60
   已经生产了10个产品,现仓储量为70
  Process finished with exit code 0

  说明:

  对于本例,要说明的是当发现不能满足生产或者消费条件的时候,调用对象的wait方法,wait方法的作用是释放当前线程的所获得的锁,并调用 对象的notifyAll() 方法,通知(唤醒)该对象上其他等待线程,使得其继续执行。这样,整个生产者、消费者线程得以正确的协作执行。

  notifyAll() 方法,起到的是一个通知作用,不释放锁,也不获取锁。只是告诉该对象上等待的线程“可以竞争执行了,都醒来去执行吧”。

  本例仅仅是生产者消费者模型中最简单的一种表示,本例中,如果消费者消费的仓储量达不到满足,而又没有生产者,则程序会一直处于等待状态,这当 然是不对的。实际上可以将此例进行修改,修改为,根据消费驱动生产,同时生产兼顾仓库,如果仓不满就生产,并对每次最大消费量做个限制,这样就不存在此问 题了,当然这样的例子更复杂,更难以说明这样一个简单模型。

分享到:
评论
1 楼 帅先勃 2012-07-28  

相关推荐

    Java 生产者消费者模式

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

    java多线程实现生产者和消费者

    通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。

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

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

    Java多线程 生产者-消费者模式

    生产者-消费者模式是一种经典的多线程设计模式,用于解决数据共享问题,尤其是在一个线程生产数据而另一个线程消费数据的情况下。在这个模式中,生产者负责生成数据并放入共享的数据结构(如队列),而消费者则从这...

    java实现生产者消费者

    生产者消费者模式是设计模式中的一种行为模式,它的主要目标是同步不同组件之间的操作,这些组件之间通过共享数据进行交互。在这个模式中,生产者负责创建产品并放入缓冲区,而消费者则负责从缓冲区取出产品进行...

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

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

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

    总之,生产者消费者模式是多线程编程中的一种重要设计模式,它通过信号量和条件变量实现了线程间的同步和通信,有效提高了系统资源的利用率和整体效率。在Java中,我们可以借助并发库轻松实现这一模式,使得代码更加...

    Java 生产消费者模式

    Java生产消费者模式是一种经典的并发设计模式,用于解决多个线程之间的协作问题。在这个模式中,生产者负责生成数据,而消费者则负责消费这些数据。它基于“缓冲区”概念,即一个有限大小的数据存储区域,生产者将...

    java生产者消费者

    Java生产者消费者模式是一种多线程设计模式,它在并发编程中被广泛使用,用于解决资源的共享问题。在这个模式中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。它们通过一个共享的数据缓冲区进行通信,避免...

    java生产者消费者demo

    在Java编程中,"生产者消费者问题"是一个经典的多线程同步问题,它涉及到了如何在多线程环境下有效地共享资源。在这个问题中,"生产者"负责创建资源,而"消费者"则负责消费这些资源。为了确保生产者不会在资源耗尽时...

    Java JDK1.5 生产消费者模式解决方案

    在Java编程语言中,生产者消费者模式是一种经典的多线程设计模式,用于处理并发问题。在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`...

    java生产者与消费者实验报告

    在并发编程中,生产者-消费者模式是一种经典的解决同步问题的设计模式。本实验旨在通过实际编程操作,深入理解Java中生产者与消费者模型的工作机制及其同步控制策略,具体目标为实现多生产者与多消费者之间的数据...

    java生产者消费者模型

    5. **设计模式**:生产者消费者模型可以看作是一种“生产者-消费者”设计模式的实例,它属于行为设计模式,用于协调异步处理和共享资源。此外,还可以结合观察者模式,让消费者订阅生产者,当有新数据时,生产者通知...

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

    生产者消费者模式是一种经典的多线程同步问题,用于在并发...通过这个项目,开发者不仅展示了如何实现生产者消费者模式,还提供了用户友好的界面来动态调整参数,使得学习者可以更直观地理解和研究这一并发设计模式。

    生产者消费者java源码

    在Java中,`BlockingQueue`接口是实现生产者消费者模式的关键组件。它提供了一种线程安全的数据结构,允许线程在尝试插入或删除元素时自动进行阻塞,直到操作可以执行。例如,`ArrayBlockingQueue`或`...

    java 生产者消费者问题(源码)

    Java生产者消费者问题是多线程编程中的一个经典案例,它主要展示了如何通过共享资源来实现线程间的协作。这个问题源于现实生活中的生产流水线,其中生产者负责制造产品,而消费者负责消耗这些产品。在计算机系统中,...

    java 编写的生产者与消费者问题

    在计算机科学中,生产者-消费者问题是多线程并发控制中的一个经典问题。该问题描述了两个并发执行的进程——生产者和消费者,它们共享一个有限大小的缓冲区。生产者进程负责生成数据(消息)并放入缓冲区,而消费者...

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

    【生产者/消费者模式】是一种常见的并发编程和系统设计模式,它主要解决的是在多线程环境下,如何协调生产者和消费者之间的数据处理问题。在软件开发中,生产者通常是生成数据的一方,而消费者则是处理这些数据的...

    java线程安全以及生产者消费者demo

    而生产者消费者模型是一种设计模式,用于解决资源分配和消耗的问题,它通过共享缓冲区来协调生产者和消费者线程之间的通信。 线程安全主要涉及到以下几个方面: 1. **同步机制**:Java提供了多种同步机制,如`...

Global site tag (gtag.js) - Google Analytics