新闻中心> 文章详情

生产者消费者问题理解与Java实现 南京Java培训

2016年03月18日

  生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程--即所谓的"生产者"和"消费者"--在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。南京Java培训

 

  要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。通常采用进程间通信的方法解决该问题,常用的方法有信号灯法等。如果解决方法不够完善,则容易出现死锁的情况。出现死锁时,两个线程都会陷入休眠,等待对方唤醒自己。该问题也能被推广到多个生产者和消费者的情形。南京Java培训

 

  Java代码模拟生产者-消费者

 

  产品类

 

  package org.dennist.thread.demo;

 

  /**

 

  *

 

  *  Product.java

 

  *

 

  *  @version : 1.1

 

  *

 

  *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>

 

  *

 

  *  @since     : 1.0        创建时间:    2013-2-25        上午09:03:38

 

  *

 

  *  TODO     :    class Product.java is used for …

 

  *

 

  */

 

  public class Product {    //产品类

 

  private int productId = 0;

 

  public Product(int productId){

 

  this.productId = productId;

 

  }

 

  public int getProductId() {

 

  return productId;南京Java软件培训

 

  }

 

  public void setProductId(int productId) {

 

  this.productId = productId;

 

  }

 

  @Override

 

  public String toString() {

 

  return ""+productId;

 

  }

 

  }

 

  仓库类

 

  package org.dennist.thread.demo;

 

  /**

 

  *

 

  *  StoreHouse.java

 

  *

 

  *  @version : 1.1

 

  *

 

  *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>

 

  *

 

  *  @since     : 1.0        创建时间:    2013-2-25        上午08:55:33

 

  *

 

  *  TODO     :    仓库

 

  *

 

  */

 

  public class StoreHouse { 南京Java培训

 

  private int base = 0;

 

  private int top = 0;

 

  //仓库大小

 

  private Product[] products = new Product[10];

 

  /**

 

  * 生产产品

 

  * @param product

 

  */

 

  public synchronized void push(Product product){

 

  if(top==products.length){    //如果仓库已满,等待消费

 

  try {

 

  System.out.println("仓库已满,正在等待消费");南京Java培训

 

  wait();

 

  }catch (InterruptedException e) {

 

  System.out.println("stop push product because other reasons");

 

  }


上一篇下一篇
按时发顺丰

技术交流群

Java大数据交流群560819979    加入
Python技术交流群595083299    加入
Oracle技术交流群595119011    加入
Web前端技术交流群604697610    加入
Huawei技术交流群482919361    加入
Redhat技术交流群587875348    加入
UI设计技术交流群511649801    加入
Cisco技术交流群596886705    加入
IT运维技术交流群605888381    加入