生产者消费者实验报告.doc_第1页
生产者消费者实验报告.doc_第2页
生产者消费者实验报告.doc_第3页
生产者消费者实验报告.doc_第4页
生产者消费者实验报告.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验号1成绩杭州电子科技大学学 生 实 验 报 告 书实验课程名称 计算机操作系统 开 课 学 院 软件工程学院 指导老师姓名 任一支 学 生 姓 名 王体方 王雁飞 谷莉莎 陆文英学生专业班级 软件工程10108412 10108413 2012 2013 学年 第一学期生产者消费者实验实验内容:以生产者消费者模型为依据,提供一个多线程生产者消费者实例,用VC或java实现,并具备以下功能:(1) 可改变缓冲区数目;(2) 可增加或减少线程数目;(3) 改变延迟时间;(4) 可增加或减少生产者、消费者进程数目;(5) 可改变消费者进程请求序列;一、流程图:主函数消费者生产者初始化缓冲区、消费请求队列及部分同步对象提取线程信息完成线程相关同步对象的初始化创建线程模拟生产和消费等待所有线程结束程序结束有消费请求?此产品正被消费?此请求可满足?另一生产者正在写?存在空缓冲区?确定产品位置从空缓冲区中为本生产者的产品分配一个空间进入临界区(所有生产者之间互斥)退出临界区消费产品、并判断是否应该释放产品所占缓冲区进入临界区(对同一产品进行请求的消费者之间互斥)通过信号量通知等待本产品的消费者在该韩冲去中写入产品退出临界区结束生产线程结束消费线程阻塞阻塞阻塞阻塞NNNNNYYYYY二、源代码:package pro_con;public class Mainpublic static void main(String args) new Main().start();public void start()Buffers buffers= new Buffers(5);String idList4=5,6;String idList7=1,3,5;new Pro_Thread(生产者 1,buffers,5,1).start();new Pro_Thread(生产者 2,buffers,4,2).start();new Pro_Thread(生产者 3,buffers,2,3).start();new Pro_Thread(生产者 5,buffers,7,5).start();new Pro_Thread(生产者 6,buffers,1,6).start();new Con_Thread(消费者 4,buffers,6,idList4).start();new Con_Thread(消费者 7,buffers,3,idList7).start();Buffers.java:package pro_con;/缓冲区public class Buffers private int productNum;/缓冲单元数目 public static Product products;/缓冲区队列 private int count=0; /记录使用的缓冲区单元public Buffers(int productNum)super();ductNum = productNum;ducts = new ProductproductNum;this.initBuffersPool();/初始化该缓冲区public void initBuffersPool()for (int i = 0; i products.length; i+)productsi = new Product();productsi.setProductId(-1);/取出产品public synchronized Product get(String id)Product product = null;while(count=0)trysuper.wait(); catch (InterruptedException e)e.printStackTrace();this.notifyAll();int x = -1;int i = 0;for (i = 0; i products.length; i+) if(productsi.getProductId().equals(id)x = i;product = productsi;productsi.setProductId(-1);break;while(i = products.length)trysuper.wait();for (i = 0; i products.length; i+) if(productsi.getProductId() = id)x = i;product = productsi;productsi.setProductId(-1);break; catch (InterruptedException e)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 +productsx+n);return product; /添加产品public synchronized boolean put(String productId)boolean bool = false;/如果满了,就等待消费者消费while(count = products.length)trysuper.wait();catch(Exception e)e.printStackTrace();this.notifyAll();int i = findPutLocation();System.out.println(Thread.currentThread().getName() + 开始在t缓冲区+ i + t生产);bool = true;productsi.setProductId(productId);count+;System.out.println(Thread.currentThread().getName() + 完成生产n);System.out.println(缓冲区 + i + t + productsi+n);return bool; /找一个合适的位置public synchronized int findPutLocation()int k = 0;for (int i = 0; i products.length; i+)if(productsi.getProductId().equals(-1)k = i;break;return k;Product.java:package pro_con;/产品public class Product private String productId;public String getProductId()return productId;public void setProductId(String productId)ductId = productId;public String toString()return productId; 消费者线程:Con_Thread.java:package pro_con;public class Con_Thread extends Threadprivate static final int baseTime = 1000;private String idList;/消费者消费产品private int n;/ 延迟时间private Buffers buffers; private int i = 0;public Con_Thread(String name, Buffers buffers, int n, String idList)super(name);this.idList = idList;this.n = n;this.buffers = buffers;Overridepublic void run()while (i idList.length)tryThread.sleep(n * baseTime);System.out.println(Thread.currentThread().getName() + 请求消费t+ idListi + 产品);buffers.get(idListi);+i; catch (InterruptedException e)e.printStackTrace();生产者线程:Pro_Thread.java:package pro_con;public class Pro_Thread extends Threadprivate static final int baseTime = 1000;private Buffers buffers; private int n; private String id;public Pro_Thread(String name ,Buffers buffers,int n,String id)super(name);this.n = n;this.buffers =buffers;this.i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论