本文章为小编原创,请尊重文章的原创性,转载请注意写明转载来源:http://blog.csdn.net/u012116457

已知技术參数:

生产者消费者问题,描写叙述一组生产者向一组消费者提供产品/消息。它们共享一个有界缓冲区,生产者向当中放产品/消息,消费者从中取产品/消息。仅仅要缓冲区未满,生产者可放产品/消息,仅仅要缓冲区有数据。消费者可取消息。

即应满足下列二个同步条件:

1.仅仅有在缓冲池中至少有一个缓冲区已存入消息后,消费者才干从中提取消息。否则消费者必须等待。

2.仅仅有缓冲池中至少有一个缓冲区是空时,生产者才干把消息放入缓冲区,否则生产者必须等待。

设计要求:

要求设定一个缓冲池中有n个缓冲区。每一个缓冲区存放一个消息。创建多个生产者,消费者,并在每一个生产者消费者创建时、发出放/取产品申请时、正在放/取产品时和放/取产品结束时分别给出提示信息。并显示取/方产品前后的缓冲区状态。以检查全部处理都遵守对应的操作限制。

上代码:

最核心的代码:

package kcsj;
/**
* 模拟实现生产者--消费者问题
*
* @date 2014/06/24
*
*/
public class ProductiveConsumption {
private int front=0; //队头
private int next=0; //队尾
private int bufferLength; //缓冲区大小
private String buffer[]; //缓冲区
private int emptyNum; //空缓冲区数目
public ProductiveConsumption(int bufferLength){
this.bufferLength=bufferLength;
buffer=new String[bufferLength];
emptyNum=bufferLength;
}
//生产
public synchronized void produce(String data){
System.out.println("生产前,空缓冲区数目-----------"+emptyNum);
System.out.println("***生产者正在生产"+data);
while(full()){
System.out.println("*****缓冲池已满,生产等待");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
buffer[next]=data;
next=(next+1)%bufferLength;
System.out.println("****生产者成功生产:"+data);
emptyNum--;
System.out.println("生产后,空缓冲区数目-----------"+emptyNum);
}
//消费
public synchronized void consum(){
System.out.println("消费前,空缓冲区数目-----------"+emptyNum);
while(empty()){
System.out.println("*****缓冲池为空,消费等待");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("***消费者正在消费"+buffer[front]);
this.notify();
System.out.println("****消费者成功消费:"+buffer[front]);
front=(front+1)%bufferLength;
emptyNum++;
System.out.println("消费后,空缓冲区数目-----------"+emptyNum);
}
//缓冲池是否已满
public boolean full(){
if(emptyNum==0){
return true;
}
return false;
}
//缓冲池是否为空
public boolean empty(){
if(bufferLength==emptyNum){
return true;
}
return false;
} }

其它辅助代码:

package kcsj;
/**
*创建生产者
*/
public class CreateProducer implements Runnable{
ProductiveConsumption pc;
int producerNum;
public CreateProducer(ProductiveConsumption pc,int producerNum){
this.pc=pc;
this.producerNum=producerNum;
}
public void run(){
for(int i=0;i<producerNum;i++){
Producer producer=new Producer(pc);
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package kcsj;
/**
*创建消费者
*/
public class CreateConsumer implements Runnable{
ProductiveConsumption pc;
int consumerNum;
public CreateConsumer(ProductiveConsumption pc,int consumerNum){
this.pc=pc;
this.consumerNum=consumerNum;
}
public void run(){
for(int i=0;i<consumerNum;i++){
Consumer consumer=new Consumer(pc);
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package kcsj;

public class Producer{
ProductiveConsumption pc;
public Producer(ProductiveConsumption pc){
this.pc=pc;
System.out.println("*成功创建一个生产者");
apply();
}
public void apply(){
char c=(char)(Math.random()*26+'A');
String data=String.valueOf(c);
System.out.println("**生产者发出请求");
pc.produce(data);
} }
package kcsj;

public class Consumer{
ProductiveConsumption pc;
public Consumer(ProductiveConsumption pc){
this.pc=pc;
System.out.println("*成功创建一个消费者");
apply();
}
public void apply() {
System.out.println("**消费者发出请求");
pc.consum();
}
}
package kcsj;

import java.util.Scanner;

public class Test {

	public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("输入缓冲区大小");
int buffLength=sc.nextInt();
System.out.println("输入生产者和消费者个数");
int prodecerNum=sc.nextInt();
int consumerNum=sc.nextInt(); ProductiveConsumption pc=new ProductiveConsumption(buffLength);
Runnable cp=new CreateProducer(pc,prodecerNum);
Runnable cc=new CreateConsumer(pc,consumerNum);
Thread t1=new Thread(cp);
Thread t2=new Thread(cc);
t1.start();
t2.start();
}
}

java模拟实现生产者---消费者问题的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 用Java写一个生产者-消费者队列

    生产者消费者的模型作用 通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用. 解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系 ...

  7. Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)

    生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. Blockin ...

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

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

  9. Java多线程同步——生产者消费者问题

    这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型 public class ProduceConsumer{ public static void main(String[] args) ...

随机推荐

  1. BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )

    线段树.. --------------------------------------------------------------------------------- #include< ...

  2. 条款21: 必须返回对象时,不要强行返回对象的reference

    总结: 绝不要返回一个local栈对象的指针或引用:绝不要返回一个被分配的堆对象的引用:绝不要返回一个静态局部对象(为了它,有可能同时需要多个这样的对象的指针或引用). 条款4中给出了“在单线程环境中 ...

  3. Oracle Split 函数

    为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行 ...

  4. word2vec代码解释

    以前看的国外的一篇文章,用代码解释word2vec训练过程,觉得写的不错,转过来了 原文链接 http://nbviewer.jupyter.org/github/dolaameng/tutorial ...

  5. selenium 怎么处理display:none

    页面HTML是这样的:  .... <div class="cf w index-middle"> <div id="li" class=&q ...

  6. 在word中批量制作条形码

    条码打印软件可以批量生成条形码然后直接打印,但是有些客户不需要直接打印,而是想将生成的条形码在word中进行排版,发给自己的客户或者下属部门来打印.那么如何实现在word中批量制作条形码呢? 操作很简 ...

  7. Code 16K 码

    Code 16K 码是一种多层.连续型.可变长度的条码符号,可以表示全ASCII字符集的128个字符及扩展ASCII字符.它采用UPC及Code128字符.一个16层的Code 16K符号,可以表示7 ...

  8. JAVA中IO和异常处理练习

    1.SystemI\O练习:1)通过键盘输入若干字符,并通过显示器输出:2)定义一个静态方法validOrNot()用于对输入的字符进行合法性校验,若包含非英文字符,则抛出IllegalStringE ...

  9. Hive实现oracle的Minus函数

    在Oracle中minus运算的主要功能是: 在进行两个表格或者两个查询结果的时候,返回在第一个表格/查询结果中与第二个表格/查询结果不同样的记录. 结果不同样的记录包括两种情况:A,B 表中某一行的 ...

  10. ZOJ3640-Help Me Escape

    Help Me Escape Time Limit: 2 Seconds      Memory Limit: 32768 KB Background     If thou doest well, ...