新闻中心> 文章详情
生产者消费者问题(英语: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");
}