生产者-消费者模式

转载 2015年07月06日 17:21:08
package thread.cusproc;
/**
 * 仓库类,在这里面实现生产和消费。同步互斥。
 * @author sunniwell
 *
 */
public class WareHouse {
/**
* 最大仓储量
*/
private static final int MAX_COUNT = 100;

private int currentCount;

public WareHouse(int currentCount){
this.currentCount = currentCount;
}

/**
* 生产
* @param needNum 需要生产的数量
*/
public synchronized void produce(int needNum){
while(currentCount+needNum > MAX_COUNT){
System.out.println("要生产的数量("+needNum+")超过了当前仓库可产量("+(MAX_COUNT-currentCount)+"),暂停生产。");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//简单地更改库存量,表示生产业务。
currentCount += needNum;
System.out.println("生产了"+needNum+"个产品,当前库存量为"+currentCount);
notifyAll();
}

/**
* 消费
* @param needNum 需要消费的数量
*/
public synchronized void consume(int needNum){
while(currentCount < needNum){
System.out.println("要消费的数量("+needNum+")超过了当前仓库量("+(currentCount)+"),暂停消费。");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//简单地更改库存量,表示消费业务。
currentCount -= needNum;
System.out.println("消费了"+needNum+"个产品,当前库存量为"+currentCount);
notifyAll();
}

}


package thread.cusproc;

public class Producer extends Thread {
private WareHouse house;
private int needNum;

public Producer(WareHouse house, int needNum){
this.house = house;
this.needNum = needNum;
}

@Override
public void run() {
house.produce(needNum);
}

}


package thread.cusproc;

public class Consumer extends Thread {
private WareHouse house;
private int needNum;

public Consumer(WareHouse house, int needNum){
this.house = house;
this.needNum = needNum;
}

@Override
public void run() {
house.consume(needNum);
}

}


package thread.cusproc;

public class Test {
public static void main(String[] args) {
WareHouse house = new WareHouse(20);

Consumer c1 = new Consumer(house, 30);
Consumer c2 = new Consumer(house, 60);
Consumer c3 = new Consumer(house, 20);

Producer p1 = new Producer(house, 40);
Producer p2 = new Producer(house, 10);
Producer p3 = new Producer(house, 10);
Producer p4 = new Producer(house, 15);
Producer p5 = new Producer(house, 50);

c1.start();
c2.start();
c3.start();

p1.start();
p2.start();
p3.start();
p4.start();
p5.start();

}
}


如何实现生产者消费者模式

生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”、“消费者”、“仓库”和“产品”。他们之间的关系如下: ① 生产者仅仅在仓储未满时候生产,仓满则停止生产。 ② 消费者仅仅在仓储...
  • u010339647
  • u010339647
  • 2016年07月24日 11:33
  • 4265

生产者/消费者模式之深入理解

★简介    在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者...
  • sanyuesan0000
  • sanyuesan0000
  • 2016年11月01日 15:52
  • 2468

redis 队列 生产者 消费者模式

1. 生产者:
  • terry_water
  • terry_water
  • 2015年12月29日 12:29
  • 4833

生产者消费者模式C++程序模拟实现

这里是利用C++简单模拟一个生产者消费者的工作模式。没有考虑到同步问题。 操作了一个队列,用BUFFER_SIZE控制了队列的大小,也根据需要可以不用控制大小。感觉数据结构无处不在。 使用单一设计...
  • kenden23
  • kenden23
  • 2013年11月16日 09:55
  • 2756

关于生产者/消费者/订阅者模式的那些事

生产者/消费者模式简介用来干嘛的?生产者/消费者模式的产生主要目的就是为了解决非同步的生产与消费之间的问题。什么是非同步呢? 比如我刚刚生产了某个产品,而此时你正在打游戏,没空来取,要打完游...
  • u010687392
  • u010687392
  • 2016年01月27日 14:17
  • 2198

Semaphore的使用之-多生产者-多消费者模式

本实验的目的不光是要实现生产者与消费者模式,还要限制生产者与消费者的数量,这样代码的复杂性就提高一些,但好在使用Semaphore类实现这个功能还是比较简单的。 创建实验用的项目repastTest,...
  • ApatheCrazyFan
  • ApatheCrazyFan
  • 2017年03月21日 00:05
  • 535

python中的生产者与消费者模式

Queue的说明   对于Queue,在多线程通信之间扮演重要的角色 添加数据到队列中,使用put()方法 从队列中取数据,使用get()方法 判断队列中是否还有数据,使用qsiz...
  • xun527
  • xun527
  • 2017年08月12日 22:45
  • 139

c++多线程实现生产者消费者

生产和消费思路: 生产时先扫描一遍buffer找到第一个为0(即没有产品)的位置,生产一个产品,并把产品编号(从1到10循环)存在这里。 消费时先扫描一遍buffer找到第一个不为1(即有产品)的...
  • tingyuanss
  • tingyuanss
  • 2013年04月21日 21:54
  • 7622

C++多线程学习:生产者消费者问题

多线程相关知识点: C++11 线程库:http://zh.cppreference.com/w/cpp/thread 互斥量和锁 std::unique_lock::lock 和 std::uni...
  • quzhongxin
  • quzhongxin
  • 2015年08月19日 20:56
  • 5801

JAVA多线程(三)生产者消费者模式及实现方法

介绍了生产者消费者模式以及实现方法(wait¬ify,阻塞队列
  • antony9118
  • antony9118
  • 2016年05月23日 15:15
  • 2688
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:生产者-消费者模式
举报原因:
原因补充:

(最多只允许输入30个字)