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. redis学习笔记(三)

    Spring data redis: 要求: Redis 版本 > 2.6 与 Lettuce 或 Jedis 集成,两种java开源Redis库. Spring redis主要做的两件事: 连 ...

  2. mysql-5.7.24 在centos7安装

    搭建环境:mysql5.7.24  CentOS-7-x86_64-DVD-1804.iso  桌面版 1. 进入官网:https://dev.mysql.com/downloads/mysql/ 该 ...

  3. HBase操作一

    package Hbase; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.a ...

  4. FreeRTOS内存管理

    简介 Freertos的内存管理分别在heap_1.c,heap_2.c,heap_3.c,heap_4.c,heap_5.c个文件中,选择合适的一种应用于嵌入式项目中即可. 本文的图片中 红色部分B ...

  5. SQL 查询某时间段的数据 datadiff 计算时间差

    datediff语法格式:datediff(day,开始时间,结束时间) 一.应用举例: 上面的代码,将查询 'created_time' > '2016-09-20'  的所有记录. 如果要查 ...

  6. dtree加载慢的问题

    前几天测试的时候,感觉dtree还行,也不是很慢.今天把树分支扩大以后就懵逼了,慢的一匹. 仔细看了下,才发现原来画分支的时候每次都会请求那些图,反复请求下加载时候无形拉长了很多.没有办法,就只能在h ...

  7. 93. Balanced Binary Tree [easy]

    Description Given a binary tree, determine if it is height-balanced. For this problem, a height-bala ...

  8. 《图说VR入门》——googleVR入门代码分析

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/53013843 作者:car ...

  9. RHSCA模拟考试

    开始考试:桌面是个黑框子 点击reboot按钮,破解密码 开机成功,输入startx进入图形界面 不能复制,要在物理机用ssh root@172.25.0.11 远程连接,就可以复制粘贴了 * Hos ...

  10. 【LG4185】[USACO18JAN]MooTube

    [LG4185][USACO18JAN]MooTube 题面 洛谷 题解 先将所有操作和询问离线 然后按照边权从大到小将操作和询问排序 利用\(two\;pointers\),每次扫到一个询问,将边权 ...