本文章为小编原创,请尊重文章的原创性,转载请注意写明转载来源: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. STL之list(双向链表)

    一,概述 List将元素按顺序储存在链表中. 与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢. list 不仅是一个双向链表,而且是一个环状双向链表 二,使用 #incl ...

  2. [C#参考]委托机制

    1. 委托概述 这是一个新的概念,但是其本质并不是什么新鲜的事物,委托本质上就是一个类.只不过一般的类是数据的集合,委托保存的是一个或者多个方法.委托是引用类型,因此委托有引用和对象,同时委托对象中包 ...

  3. 取出js对象的所有属性的方式

    例子: //取出事件的所有属性 $('#id_btn').bind("click dbclick mouseout",{crdx:'我是传的值'},function(e){ var ...

  4. linux系统调用和库函数调用的区别(转)

    Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).可以参考<Linux程序设计>(英文原版为<Beginning ...

  5. System.Web Namespce

    System.Web概述: System.Web是.NET中web应用开发的一个基础类库,定义浏览器与服务器之间的所有操作方法,包括请求输入流(HttpRequest).输出流(HttpRespons ...

  6. USB CCID协议和PC/SC标准

    CCID是USB Chip/Smart Card Interface Devices,也就是USB芯片智能卡接口设备,是USB规范下的一种设备类型.就像HID设备一样,需要参考USB规范来写固件程序来 ...

  7. QT图片旋转

    目前发现有两种方法,如下: 1.使用QPixmap的transformed函数旋转,这个函数默认是以图片中心为旋转点,不能随意设置旋转点,使用如下: QMatrix leftmatrix; leftm ...

  8. Xamarin.Android开发实践(四)

    原文:Xamarin.Android开发实践(四) Xamarin.Android下获取与解析JSON 一.新建项目 1.新建一个Android项目,并命名为为NetJsonList 2.右击引用,选 ...

  9. BZOJ 1601 [Usaco2008 Oct]灌水

    1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MB Description Farmer John已经决定把水灌到他的n(1 ...

  10. RBAC - 基于角色的权限控制

    ThinkPHP中关于RBAC使用详解 自己的源码下载:百度网盘,thinkPHP文件夹下,RBAC文件夹. 重要的是,权限信息的写入函数等.在源码中能找到,Modules/Amin/Common/c ...