Java中的生产者、消费者问题描述:

  生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库). 其中一个是生产者, 用于将产品放入仓库: 另外一个是消费者, 用于从仓库中取出产品消费. 问题出现在当仓库已经满了, 而此时生产者还想向其中放入一个新的产品的情形, 其解决方法是让生产者此时进行等待, 等待消费者从仓库中取走了一个或者多个产品后再去唤醒它. 同样地, 当仓库已经空了, 而消费者还想去仓库消费产品, 此时也可以让消费者进行等待, 等待生产者放入一个或者多个产品时再唤醒它.

生产者、消费者问题需明确以下信息:

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

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

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

  4、消费者发现仓储没产品可消费时候会通知生产者生产.

Demo:

public class ProducerConsumer {
public static void main(String[] args){
SynStack ss = new SynStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
Thread p1 = new Thread(p);
Thread c1 = new Thread(c);
p1.start();
c1.start();
}
}
class Bread {
int id;
public Bread(int id) {
this.id = id;
}
@Override
public String toString() {
return "Bread: "+ id;
}
}
class SynStack {
Bread bread[] = new Bread[6];
int index = 0;
public synchronized void pushBread(Bread bre){
while(index == bread.length){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
bread[index] = bre;
index++;
}
public synchronized Bread popBread() {
while(index == 0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
return bread[index];
}
}
class Producer implements Runnable{
SynStack ss = null;
Producer(SynStack ss){
this.ss = ss;
}
@Override
public void run() {
for(int i=0;i<20;i++){
Bread bread = new Bread(i);
ss.pushBread(bread);
System.out.println("后厨生产了:"+bread);
}
}
}
class Consumer implements Runnable{
SynStack ss = null;
Consumer(SynStack ss){
this.ss = ss;
}
@Override
public void run() {
for(int i=0;i<20;i++){
Bread bread = ss.popBread();
System.out.println("顾客消费了:"+bread);
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

某次运行结果:

后厨生产了:Bread: 0
后厨生产了:Bread: 1
后厨生产了:Bread: 2
顾客消费了:Bread: 0
后厨生产了:Bread: 3
后厨生产了:Bread: 4
后厨生产了:Bread: 5
后厨生产了:Bread: 6
顾客消费了:Bread: 6
后厨生产了:Bread: 7
顾客消费了:Bread: 7
后厨生产了:Bread: 8
后厨生产了:Bread: 9
顾客消费了:Bread: 8
顾客消费了:Bread: 9
后厨生产了:Bread: 10
顾客消费了:Bread: 10
后厨生产了:Bread: 11
顾客消费了:Bread: 11
后厨生产了:Bread: 12
顾客消费了:Bread: 12
后厨生产了:Bread: 13
顾客消费了:Bread: 13
后厨生产了:Bread: 14
顾客消费了:Bread: 14
后厨生产了:Bread: 15
顾客消费了:Bread: 15
后厨生产了:Bread: 16
顾客消费了:Bread: 16
后厨生产了:Bread: 17
顾客消费了:Bread: 17
后厨生产了:Bread: 18
顾客消费了:Bread: 18
后厨生产了:Bread: 19
顾客消费了:Bread: 19
顾客消费了:Bread: 5
顾客消费了:Bread: 4
顾客消费了:Bread: 3
顾客消费了:Bread: 2
顾客消费了:Bread: 1

Java中的生产者、消费者问题的更多相关文章

  1. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  2. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

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

    Java设计模式之生产者消费者模式 博客分类: 设计模式 设计模式Java多线程编程thread 转载 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一 ...

  4. java多线程模拟生产者消费者问题,公司面试常常问的题。。。

    package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...

  5. java多线程解决生产者消费者问题

    import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...

  6. celery中的生产者消费者问题

    celery中的生产者消费者问题 在task1.py文件中: # demo1:task.py and celery.py in one file# run it byfrom celery impor ...

  7. JAVA多线程之生产者 消费者模式 妈妈做面包案例

    创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包  最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...

  8. java中的生产者和消费者的问题

    1----使用Java.util.concurrent.locks包中的lock接口取代synchronized,通过ReentrantLock这个已经实现Lock接口的类, 创建ReentrantL ...

  9. Java并发之:生产者消费者问题

    生产者消费者问题是Java并发中的常见问题之一,在实现时,一般可以考虑使用juc包下的BlockingQueue接口,至于具体使用哪个类,则就需要根据具体的使用场景具体分析了.本文主要实现一个生产者消 ...

随机推荐

  1. ASP.NET Core 资源打包与压缩

    ASP.NET Core 资源打包与压缩 在ASP.NET 中可以使用打包与压缩来提高Web应用程序页面加载的性能. 打包是将多个文件(CSS,JS等资源文件)合并或打包到单个文件.文件合并可减少We ...

  2. PetaLinux安装及使用

    Description/说明 PetaLinux版本:2016.4 操作系统版本:Ubuntu 16.04(如使用Ubuntu,墙裂建议使用16.04,其他版本官方手册并没有标明支持,可能会出现莫名其 ...

  3. Python之路(五)-->> 格式化

    在Python中格式化的方式有两种,一种是%,另外一种是format()格式化. ----------------------------------------------------------- ...

  4. hadoop deployment

    本文主要是以安装和使用hadoop-0.12.0为例,指出在部署Hadoop的时候容易遇到的问题以及如何解决. 硬件环境共有3台机器,均使用的FC5系统,Java使用的是jdk1.6.0.IP配置如下 ...

  5. 20155215 2016-2017-2 《Java程序设计》第6周学习总结

    20155215 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 stream:串流.抽象化输入/输出概念.将数据从来源取出,使用输入串流:将数据写入 ...

  6. 20155222 2016-2017-2 《Java程序设计》实验一

    实现Fibonacci数列功能,并进行测试. 源代码: import java.util.Scanner; public class fibonacci { public static void ma ...

  7. 【MYSQL经验】MYSQL经验总结

    1.决定是否添加一个新的所以并部署它需要考虑很多因素

  8. java生成pdf

    介绍 本篇博客主要是为了介绍如何使用:flying-saucer+itext+freemark实现导出复杂点的pdf文件. 思路 先把pdf的内容以html形式准备好 使用freemarker将htm ...

  9. Jupyter 安装并配置工作路径[转]

    1.通过python的pip方式安装jupyterpython和pip都安装好后,通过cmd进入命令提示窗口,找到python安装目录下的Script目录,例如我的是路径是:C:\Program Fi ...

  10. 微信小程序和微信H5测试中易出Bug的点和注意事项

    一.微信小程序 易出Bug的点: 小程序的分享转发功能 背景:小程序项目开发基本完毕也都已经测过几轮,功能上基本没有什么问题,但是上线后却被客户发现通过分享转发小程序给别人,别人无法正常打开的情况 原 ...