java网络编程生产者消费者问题.docx
- 文档编号:16053573
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:11
- 大小:147.04KB
java网络编程生产者消费者问题.docx
《java网络编程生产者消费者问题.docx》由会员分享,可在线阅读,更多相关《java网络编程生产者消费者问题.docx(11页珍藏版)》请在冰点文库上搜索。
java网络编程生产者消费者问题
网络编程实验报告
实验题目:
生产者/消费者问题
*****
学号:
**********
班级:
信息安全091班
完成时间:
2011.10.25—2011.11.05
********
一、实验概述
1.1实验目的
了解进程的同步、互斥机制,认识理解其过程,并用于解决生产者/消费者问题。
使用java编程实现“生产者——消费者”多线程同步问题。
1.2任务描述
有两个生产者,每个生产者每次可以生产1个产品,有一个消费者每次消费2个产品,仓库最多只能存放2个产品,若仓库满,则生产者需等待空位来存放产品,若仓库产品数量不足,则消费者需等待来消费产品。
请用多线程技术实现以上功能,要求生产者存放产品时按先来先服务的队列原则来存放产品。
二、功能及处理逻辑设计
2.1具体要求
1.三个线程。
t0,t1分别代表生产者A,生产者B。
t2代表消费者consumer
2.一个仓库(缓冲区),最大存量为两个产品
2.1功能及模块设计
2.2特别功能
1.Thread.sleep((int)(Math.random()方法令线程随机发生。
2.用synchronized来实现同步,当仓库满时,等待消费线程,若发生生产者线程则立即等待,进入沉睡状态,当消费线程发生时,同时逐一激活已沉睡生产进程,实现先来先服务。
3.用synchronized来实现同步,当仓库未满时,发生消费线程,则等待(睡眠),当发生线程,使仓库数为2,激活消费线程。
4.定义一个新线程必须重写父类的run方法。
2.3算法搭建
三、源代码及方法解释(重点步骤已用红色注释)
本次方法中未用到队列,利用的是多次调用线程,逐一实现先来先服务
importjava.util.*;
publicclassxiancheng
{
publicstaticvoidmain(String[]args)
{
StoreHousestoreHouse=newStoreHouse();
Producerproducer1=newProducer("生产者A",storeHouse);
Producerproducer2=newProducer("生产者B",storeHouse);
Consumercomsumer=newConsumer("消费者",storeHouse);
Threadt0=newThread(producer1);
Threadt1=newThread(producer2);
Threadt2=newThread(comsumer);
t0.start();
t1.start();
t2.start();
}
}
classProducerextendsThreadimplementsRunnable//定义生产者线程
{
privateStringproducerName=null;
privateStoreHousestoreHouse=null;
publicProducer(StringproducerName,StoreHousestoreHouse)
{
this.producerName=producerName;
this.storeHouse=storeHouse;
}//声明生产者要放产品的仓库
publicvoidsetProducerName(StringproducerName)
{
this.producerName=producerName;
}
publicStringgetProducerName()
{
returnproducerName;
}
publicvoidrun()//定义一个新线程必须重写父类的run方法
{
while(true)
{
storeHouse.store_in(this);
try
{
Thread.sleep((int)(Math.random()*2500));
}//定义线程休眠时间
catch(InterruptedExceptione)
{
return;
}//有可能抛出异常,必须对它进行捕捉
}
}
}
classConsumerextendsThreadimplementsRunnable
{
//定义消费者线程
publicStringconsumerName=null;
publicStoreHousestoreHouse=null;
publicConsumer(StringconsumerName,StoreHousestoreHouse)
{
this.consumerName=consumerName;
this.storeHouse=storeHouse;
}
publicvoidsetConsumerName(StringconsumerName)
{
this.consumerName=consumerName;
}
publicStringgetConsumerName()
{
returnconsumerName;
}
publicvoidrun()
{
while(true)
{
storeHouse.store_out(this);
try
{
Thread.sleep((int)(Math.random()*5000));}
//定义线程休眠时间
catch(InterruptedExceptione)
{
return;
}
}
}
}
classStoreHouse
{
intcount=0;//创建仓库,用来放产品
publicsynchronizedvoidstore_in(Producerpro)
{
while(count==2)//仓库容量为2
{
System.out.println("仓库已满,"+pro.getProducerName()+"正等待生产...");
try
{
this.wait();//生产者线程进入沉睡
}
catch(InterruptedExceptione)
{
}
}
count++;//产品数自加1
System.out.println(pro.getProducerName()+"生产了1个产品,库存为"+count);//激活等待的线程,实现先来先服务
notify();
}
publicsynchronizedvoidstore_out(Consumercon)
{
while(count==0||count==1)
{
try
{
System.out.println("仓库数量不足,消费者等待消费...");
this.wait();
}
catch(InterruptedExceptione)
{
}
}
count=count-2;
System.out.println(con.getConsumerName()+"消费了2个产品,库存为"+count);
notify();
}
}
四、程序截图
1.先来先服务效果
2.消费者等待情况
消费者等待的前提下,当仓库数为时立即激活线程,消费
当消费者等待时,若仓库每增加一个商品,总会检验是否为满,为则激活消费
3.程序效果图总览:
其中体现了线程随机性发生,等等各方面情况
五、实验总结
本次试验我基本上掌握了java多线程同步的方法,完成老师的任务,但是熟练程度还远远未够,将来我也必须更加努力,力求让自己java编程能力更强
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 网络 编程 生产者 消费者 问题
![提示](https://static.bingdoc.com/images/bang_tan.gif)