java模拟实现生产者---消费者问题
本文章为小编原创,请尊重文章的原创性,转载请注意写明转载来源: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模拟实现生产者---消费者问题的更多相关文章
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】
java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...
- Java设计模式之生产者消费者模式
Java设计模式之生产者消费者模式 博客分类: 设计模式 设计模式Java多线程编程thread 转载 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一 ...
- JAVA多线程之生产者 消费者模式 妈妈做面包案例
创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包 最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...
- 用Java写一个生产者-消费者队列
生产者消费者的模型作用 通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用. 解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系 ...
- Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)
生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. Blockin ...
- Java并发之:生产者消费者问题
生产者消费者问题是Java并发中的常见问题之一,在实现时,一般可以考虑使用juc包下的BlockingQueue接口,至于具体使用哪个类,则就需要根据具体的使用场景具体分析了.本文主要实现一个生产者消 ...
- Java多线程同步——生产者消费者问题
这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型 public class ProduceConsumer{ public static void main(String[] args) ...
随机推荐
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- [C#参考]事件和委托的关系
前面说了委托,接下来就要说一说事件了,同时最后再说一下委托和事件的区别. 事件和委托很相似,事件就好像是被简化的针对特殊用途的委托.看下面的图: 从这张图中能看到,事件是发布者的一个成员,它不是类型. ...
- 浅谈Linux ftp服务器相关配置
首先我们需要在Linux系统下安装FTP服务器 Ubuntu sudo apt-get install....... centos yun....... 然后,我们要配置vsftpd.conf文件 ...
- 6月10日-IOS应用-日记本
嗯,经过这几天的学习,我的第一个IOS应用,日记本算是学习完毕了,下面写一篇日记,记录所学到的知识和需要继续学习的地方. 1,首先是ViewController,必须添加两个协议UITableView ...
- JS实现常用的分享到按钮
我们阅读博客的时候经常会用到这样功能,当然有时候也会想把自己的网站上也加入类似的分享功能,各大厂商已经给出了相应的API,点击一个按钮即可弹出窗口进入分享,我们事先可以设置一些参数,一般常用的就是 网 ...
- objective-III 窗口应用程序
objective-III 一.创建窗口应用程序 打开xcode->create->在iso目录下选择empty-null->创建 在打开的项目文件名上右击NEW FILE,在io ...
- STL之Queue(Q)
STL的Queue(数据结构中的队列): 特点:FIFO 先进先出: 自适应容器(即容器适配器) 栈适配器STL queue STL中实现的Queue: 用list来实现queue: queue ...
- ViewPager引导页效果实例源码
首先大家先找到本地的sdk,然后找到Google提供的API,具体查找方法如下:sdk——>docs——>index.html——>develop——>training——&g ...
- 转百度前辈的Trados使用心得
我用Trados的时间不长,可以说是一个新手.但我在较短的时间内就已经初步掌握这个工具,说明它并不是那么神秘,并不是那么深不可测.这里,我说一说学习它的一点体会.在我转发的文章中有的内容,我就少讲一些 ...
- BZOJ 2718: [Violet 4]毕业旅行( 最长反链 )
一不小心速度就成了#1.... 这道题显然是求最长反链, 最长反链=最小链覆盖.最小链覆盖就是先做一次floyd传递闭包, 再求最小路径覆盖. 最小路径覆盖=N - 二分图最大匹配. 所以把所有点拆成 ...