生产消费类问题程序总结--java

来源:互联网 发布:c 编写unity3d脚本 编辑:程序博客网 时间:2024/05/16 15:10

对于编程 分析问题远比写代码重要的多(自己认为),在分析生产消费问题时,假定问题为:::::生产者生产馒头最多生产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///////////////////////////////////////////////////////////////////////




原创粉丝点击