实验报告生产者.docx
《实验报告生产者.docx》由会员分享,可在线阅读,更多相关《实验报告生产者.docx(11页珍藏版)》请在冰点文库上搜索。
实验报告生产者
实验报告
课程名称:
java程序设计
题目:
生产者消费者
院(系):
信息与控制工程
专业班级:
计算机1202
姓名:
张金涛
学号:
120620226
指导教师:
张翔
2014年12月17月
一、实验目的
实现生产者-消费者问题,深刻理解进程同步问题。
二、实验环境
装有jdk及eclipse的计算机一台
三、实验内容
Java程序实现生产者消费者问题
四、代码及注释
packagepro_con;
publicclassMain
{
publicstaticvoidmain(String[]args)
{
newMain().start();
}
publicvoidstart()
{
Buffersbuffers=newBuffers(5);
String[]idList4={"5","6"};
String[]idList7={"1","3","5"};
newPro_Thread("生产者1",buffers,5,"1").start();
newPro_Thread("生产者2",buffers,4,"2").start();
newPro_Thread("生产者3",buffers,2,"3").start();
newPro_Thread("生产者5",buffers,7,"5").start();
newPro_Thread("生产者6",buffers,1,"6").start();
newCon_Thread("消费者4",buffers,6,idList4).start();
newCon_Thread("消费者7",buffers,3,idList7).start();
}
}
Buffers.java:
packagepro_con;
//缓冲区
publicclassBuffers
{
privateintproductNum;//缓冲单元数目
publicstaticProductproducts[];//缓冲区队列
privateintcount=0;//记录使用的缓冲区单元
publicBuffers(intproductNum)
{
super();
this.productNum=productNum;
this.products=newProduct[productNum];
this.initBuffersPool();
}
//初始化该缓冲区
publicvoidinitBuffersPool()
{
for(inti=0;i{
products[i]=newProduct();
products[i].setProductId("-1");
}
}
//取出产品
publicsynchronizedProductget(Stringid)
{
Productproduct=null;
while(count==0)
{
try
{
super.wait();
}catch(InterruptedExceptione)
{
e.printStackTrace();
}
}
this.notifyAll();
intx=-1;
inti=0;
for(i=0;i{
if(products[i].getProductId().equals(id))
{
x=i;
product=products[i];
products[i].setProductId("-1");
break;
}
}
while(i==products.length)
{
try
{
super.wait();
for(i=0;i{
if(products[i].getProductId()==id)
{
x=i;
product=products[i];
products[i].setProductId("-1");
break;
}
}
}catch(InterruptedExceptione)
{
e.printStackTrace();
}
}
notifyAll();System.out.println(Thread.currentThread().getName()+"开始消费\t"+id+"产品");
count--;
System.out.println(Thread.currentThread().getName()+"成功消费\t"+id+"产品\n");
System.out.println("缓冲区["+x+"]\t"+products[x]+"\n");
returnproduct;
}
//添加产品
publicsynchronizedbooleanput(StringproductId)
{
booleanbool=false;
//如果满了,就等待消费者消费
while(count==products.length)
{
try{
super.wait();
}catch(Exceptione){
e.printStackTrace();
}
}
this.notifyAll();
inti=findPutLocation();
System.out.println(Thread.currentThread().getName()+"开始在\t缓冲区"
+i+"\t生产");
bool=true;
products[i].setProductId(productId);
count++;
System.out.println(Thread.currentThread().getName()+"完成生产\n");
System.out.println("缓冲区["+i+"]\t"+products[i]+"\n");
returnbool;
}
//找一个合适的位置
publicsynchronizedintfindPutLocation()
{
intk=0;
for(inti=0;i{
if(products[i].getProductId().equals("-1"))
{
k=i;
break;
}
}
returnk;
}
}
Product.java:
packagepro_con;
//产品
publicclassProduct
{
privateStringproductId;
publicStringgetProductId()
{
returnproductId;
}
publicvoidsetProductId(StringproductId)
{
this.productId=productId;
}
publicStringtoString()
{
returnproductId;
}
}
消费者线程:
Con_Thread.java:
packagepro_con;
publicclassCon_ThreadextendsThread
{
privatestaticfinalintbaseTime=1000;
privateStringidList[];//消费者消费产品
privateintn;//延迟时间
privateBuffersbuffers;
privateinti=0;
publicCon_Thread(Stringname,Buffersbuffers,intn,StringidList[])
{
super(name);
this.idList=idList;
this.n=n;
this.buffers=buffers;
}
@Override
publicvoidrun()
{
while(i{
try
{
Thread.sleep(n*baseTime);
System.out.println(Thread.currentThread().getName()+"请求消费\t"
+idList[i]+"产品");
buffers.get(idList[i]);
++i;
}catch(InterruptedExceptione)
{
e.printStackTrace();
}
}
}
}
生产者线程:
Pro_Thread.java:
packagepro_con;
publicclassPro_ThreadextendsThread
{
privatestaticfinalintbaseTime=1000;
privateBuffersbuffers;
privateintn;
privateStringid;
publicPro_Thread(Stringname,Buffersbuffers,intn,Stringid)
{
super(name);
this.n=n;
this.buffers=buffers;
this.id=id;
}
@Override
publicvoidrun()
{
try
{
Thread.sleep(n*baseTime);
System.out.println(Thread.currentThread().getName()+"发出请求生产信号");
buffers.put(id);
}catch(InterruptedExceptione)
{
e.printStackTrace();
}
}
}
运行结果
五、实验总结
通过本次实验,进一步提升了我在编程中分析问题,我深刻理解进程同步问题,也体会到了编程中细心、耐心、恒心的重要性,相信我会在今后的实验中有更多的进步。