1杭州电子科技大学学生实验报告书实验课程名称《计算机操作系统》开课学院软件工程学院指导老师姓名任一支学生姓名王体方王雁飞谷莉莎陆文英学生专业班级软件工程10108412101084132012—2013学年第一学期实验号1成绩2生产者消费者实验实验内容:以生产者消费者模型为依据,提供一个多线程生产者-消费者实例,用VC或java实现,并具备以下功能:(1)可改变缓冲区数目;(2)可增加或减少线程数目;(3)改变延迟时间;(4)可增加或减少生产者、消费者进程数目;(5)可改变消费者进程请求序列;一、流程图:主函数消费者生产者初始化缓冲区、消费请求队列及部分同步对象提取线程信息完成线程相关同步对象的初始化创建线程模拟生产和消费等待所有线程结束程序结束有消费请求?此产品正被消费?此请求可满足?另一生产者正在写?存在空缓冲区?确定产品位置从空缓冲区中为本生产者的产品分配一个空间进入临界区(所有生产者之间互斥)退出临界区消费产品、并判断是否应该释放产品所占缓冲区进入临界区(对同一产品进行请求的消费者之间互斥)通过信号量通知等待本产品的消费者在该韩冲去中写入产品退出临界区结束生产线程结束消费线程阻塞阻塞阻塞阻塞NNNNNYYYYY3二、源代码: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;//缓冲单元数目4publicstaticProductproducts[];//缓冲区队列privateintcount=0;//记录使用的缓冲区单元publicBuffers(intproductNum){super();this.productNum=productNum;this.products=newProduct[productNum];this.initBuffersPool();}//初始化该缓冲区publicvoidinitBuffersPool(){for(inti=0;iproducts.length;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;iproducts.length;i++){if(products[i].getProductId().equals(id)){x=i;5product=products[i];products[i].setProductId(-1);break;}}while(i==products.length){try{super.wait();for(i=0;iproducts.length;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){6booleanbool=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;iproducts.length;i++){if(products[i].getProductId().equals(-1)){k=i;break;}7}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;8publicCon_Thread(Stringname,Buffersbuffers,intn,StringidList[]){super(name);this.idList=idList;this.n=n;this.buffers=buffers;}@Overridepublicvoidrun(){while(iidList.length){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){9super(name);this.n=n;this.buffers=buffers;this.id=id;}@Overridepublicvoidrun(){try{Thread.sleep(n*baseTime);System.out.println(Thread.currentThread().getName()+发出请求生产信号);buffers.put(id);}catch(InterruptedExceptione){e.printStackTrace();}}}三、测试用例:输出结果为:10