博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java模拟实现生产者---消费者问题
阅读量:6615 次
发布时间:2019-06-24

本文共 3709 字,大约阅读时间需要 12 分钟。

本文章为小编原创,请尊重文章的原创性,转载请注意写明转载来源: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

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

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(); 	}}
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5168161.html,如需转载请自行联系原作者
你可能感兴趣的文章
Java操作MongoDB实现CRUD
查看>>
给js文件传参数
查看>>
tomcat web.xml启动加载类
查看>>
Linux 配置SSH信任
查看>>
【九度OJ1352】|【剑指offer41】和为S的两个数字
查看>>
《android-文件大小》
查看>>
HTTPS的工作原理
查看>>
PhoneGap使用PushPlugin插件实现消息推送
查看>>
Boyer-Moore 算法介绍
查看>>
关于Java中的单例模式
查看>>
datepicker
查看>>
基于vCenter/ESXi平台CentOS 6.8系统虚拟机Oracle 12c RAC双节点数据库集群搭建
查看>>
CentOS 7输入startx无法启动图形化界面
查看>>
#51CTO学院四周年# 终于在这里遇到你
查看>>
百度首次公布云业务收入,同比增长超100%,跻身国内第三
查看>>
Java学习笔记 1—命名规则、数据类型、运算符
查看>>
FusionCharts入门教程,使用指南
查看>>
我的友情链接
查看>>
数组的一些方法
查看>>
关于MFC中WM_MOUSEHOVER和WM_MOUSELEAVE消息的使用
查看>>