对于编程 分析问题远比写代码重要的多(自己认为),在分析生产消费问题时,假定问题为:::::生产者生产馒头最多生产20个一次生产一个, 消费者消费馒头最多消费20个一次消费一个,生产者将生产的馒头放入篮子中,消费者从篮子中取馒头消费。编写代码实现此过程。
分析:::问题中出现的对象:一、生产者 二、消费者 三、 篮子 四 、馒头
首先要理解各个对象之间的关系: 生产者将生产的馒头放入篮子内,,,,,,消费者将馒头从篮子中取出消费,,,,,篮子用来盛馒头,馒头的取出方式为现金后出(类似于栈的工作原理)。这就是各个对象之间的关系。
则 编写程序时 要明白:有几个类
public class ProducerConsumer{
public static void main(String[]){
}
}
class ManTou {}
class LanZi{}
class Producer{}
class Consumer{}
/**********以上是大致的框架 框架出来后腰添加血肉,则需要对各个类中的方法考虑*********/
class ManTou{} 类中应该有标志馒头的记号,,就是id,还需要对toString()方法重写,保证输出时为String类型
所以:
class ManTou{
int id;
ManTou(int id){
this.id = id;
}
public String toString(){
return "ManTou:"+id;
}
}
/****************这段代码写了ManTou的构造方法 和 toString()方法的重写*****************/
/*******************************对篮子对象写代码**************************************/
LanZi内装的是馒头 肯定会 新建馒头对象。利用数组来描述LanZi能装馒头的最大个数.然后写先进后出的方法。
class LanZi{
ManTou[] MT = new ManTou[6];///最多只能装6个馒头
int index=0;
public void push(MabnTou MT){//向篮子中放入馒头所以要传馒头参数
MT[index]=MT;
index++;
}
public ManTou pop(){//返回馒头类型
index--;
return MT[index];
}
}
/*************************以上代码为初步代码****************************/
class Producer{//生产地额馒头窑放入篮子内
LanZi LZ = new LanZi();
Producer(LanZi LZ){//构造方法,
this.LZ = LZ;
}
for(int i=0;i<20;i++){
ManTou MT = new ManTou();
Lz.push(MT);///将新生产的馒头放入篮子内
}
}
/*********************也是初步代码**************************/
class Consumer {
LanZi LZ = new LanZi();
Consumer(LanZi LZ){
this.LZ = LZ;
}
for(int i=0;i<20;i++){
Lz.pop();//将馒头消费掉
}
}
/***********************初步代码已经写完***************************/
我们考虑用线程来完成 此问题 则需要对代码进行完善
---------------------------------------------------------------------------------------------
对篮子对象的方法重写:
class LanZi{
ManTou[] MT = new ManTou[6];///最多只能装6个馒头
int index=0;
public void push(MabnTou MT){//向篮子中放入馒头所以要传馒头参数
while(index == MT.length){当生产的馒头将篮子装满时 则 当前访问此对象的线程wait
try{
this.wait();
}catch(InterruptedException e){}
}
this.notif();//将等待打断。只能打断一个线程
MT[index]=MT;
index++;
}
public ManTou pop(){//返回馒头类型
while(index == 0){
try{
this.wait();
}catch(InterruptedException e){}
}
this.notif();//将等待打断。只能打断一个线程
index--;
return MT[index];
}
}
/*****************************************************************************************/
对生产者的方法修缮
---------------------------------------------------------------------------------------------------------
class Producer implements Runnable{//生产地额馒头窑放入篮子内//继承接口,需要重写run方法
LanZi LZ = new LanZi();
Producer(LanZi LZ){//构造方法,
this.LZ = LZ;
}
public void run{
for(int i=0;i<20;i++){
ManTou MT = new ManTou();
Lz.push(MT);///将新生产的馒头放入篮子内
System.out.println("生产了"+MT);//打印是为了便于观察
try{
Thread.sleep(200);
}catch(InterruptedException e){}
}
}
}
//对消费者的方法修缮
--------------------------------------------------------------------------------------------------
class Consumer {
LanZi LZ = new LanZi();
Consumer(LanZi LZ){
this.LZ = LZ;
}
for(int i=0;i<20;i++){
ManTou MT = Lz.pop();//将馒头消费掉,为了便于观察 将pop的馒头送给MT输出
System.out.println("消费了"+MT);//打印是为了便于观察
try{
Thread.sleep(500);消费的比生产的慢
}catch(InterruptedException e){}
}
}
写主类
----------------------------------------------------------------------------------------------
public class ProducerConsumer{
public static void main(String[] args){
LanZi LZ = new LanZi;//新建篮子 用来成馒头
Producer p = new Producer(LZ);//新建的生产者将馒头 装入LZ中
Consumer c = new Consumer(LZ);
new Thread(p).start();
new Thread(c).start();
}
}
////OK///