您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 课程设计-生产者消费者问题
湖北中医学院信息技术系操作系统课程设计第1页操作系统课程设计(一号黑体加粗)用多进程同步方法解决生产者-消费者问题(小二黑体加粗)院系:信息工程学院班级:信工(2)班学号:XXXXXXXX姓名:XX同组者:本人时间:2011/12/8湖北中医学院信息技术系操作系统课程设计第2页目录(小二黑体加粗)操作系统课程设计(一号黑体加粗)........................1目录(小二黑体加粗)............................................2一、题目:(标题2,即三号黑体加粗)...............3二、设计目的:.......................................................3三、总体设计思想概述:........................................3四、说明:...............................................................3五、设计要求:............................................................3六、设计方案:.......................................................3七、流程图:...........................................................4八、运行结果...........................................................4九源程序.................................................................6十、总结.................................................................11十一、参考文献..........................................................11湖北中医学院信息技术系操作系统课程设计第3页一、题目:(标题2,即三号黑体加粗)用多进程同步方法解决生产者-消费者问题。二、设计目的:通过研究Linux的进程机制和信号量实现生产者消费者问题的并发控制。三、总体设计思想概述:1、生产者—消费者问题是一种同步问题的抽象描述。2、计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。3、而当某个进程释放资源时,则它就相当一个生产者。四、说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。五、设计要求:1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。2、生产者和消费者各有两个以上。3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。六、设计方案:1、生产者仅仅在仓储未满时候生产,仓满则停止生产。2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。湖北中医学院信息技术系操作系统课程设计第4页3、当消费者发现仓储没产品可消费时候会通知生产者生产。4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。5、此模型将要结合java.lang.Object的wait与notify、notifyAll方法来实现以上的需求。七、流程图:八、运行结果1、截图一:生产者线程开始生产、消费者线程随后消费及生产者或消费者执行生产操作后缓冲区当前状态的截图:开始ProduceWaitBufferWaitProductsConsume结束WhileproduceWhileconsume湖北中医学院信息技术系操作系统课程设计第5页2、截图二:缓冲区已满,信号量empty0生产者线程进入等待队列的截图:上图的辅助解释图:缓冲区的20个存储单元满时缓冲区的状态的截图:湖北中医学院信息技术系操作系统课程设计第6页3、截图三:生产者线程ProducerThread_0完成自己的任务后,该线程撤销的截图:4、截图四:消费者执行消费操作后的缓冲区的状态的部分截图:5、截图五:生产消费完毕的截图:九源程序/***@(#)ProducerConsumer.java***@author*@version1.002011/12/12*/classBuffer{//有界缓冲区int[]array=newint[21];//设置缓冲区的大小为20个存储单元intfull=0;//缓冲区里产品的数目初始湖北中医学院信息技术系操作系统课程设计第7页值为0intempty=20;//缓冲区里还剩空位置的数目初始值为20//intempty=array.length;publicsynchronizedvoidpush(inti){//生产数据项操作,即P操作(通过syschoronized实现有节缓冲区的互斥操作)while(empty==0){try{System.out.println(缓冲区已满,生产者线程进入等待队列);this.wait();}catch(InterruptedExceptione){e.printStackTrace();}}notify();System.out.println(Thread.currentThread().getName()+生产:+i);full++;empty--;array[full]=i;//送一个产品到有界缓冲区System.out.println(full:+full+\tempty:+empty+\t生产者线程执行操作后,缓冲区当前的数据为:);for(intj=1;j=full;j++){System.out.print(array[j]+\t);}System.out.println();}publicsynchronizedvoidpop(){//消费数据项操作,即V操作(通过syschoronized实现有节缓冲区的互斥操作)湖北中医学院信息技术系操作系统课程设计第8页while(full==0)try{System.out.println(缓冲区里没有供消费的产品,消费者线程进入等待队列。);this.wait();}catch(InterruptedExceptione){e.printStackTrace();}notify();System.out.println(Thread.currentThread().getName()+消费:+array[full]);empty++;full--;System.out.println(消费者线程执行操作后,缓冲区当前的数据为:);for(intj=1;j=full;j++){System.out.print(array[j]+\t);}System.out.println();}}classProducerimplementsRunnable{//实现Runnble的生产者privateBufferbf;Producer(Bufferbf){this.bf=bf;}publicvoidrun(){湖北中医学院信息技术系操作系统课程设计第9页for(inti=1;i=20;i++){bf.push(i);try{Thread.sleep((int)(Math.random()*2000));}catch(InterruptedExceptione){e.printStackTrace();}}System.out.println(Thread.currentThread().getName()+线程完成自己的任务,该线程消亡!);}}classConsumerimplementsRunnable{//实现Runnble的消费者privateBufferbf;Consumer(Bufferbf){this.bf=bf;}publicvoidrun(){for(inti=1;i=20;i++){bf.pop();try{Thread.sleep((int)(Math.random()*4000));}catch(InterruptedExceptione){e.printStackTrace();}}湖北中医学院信息技术系操作系统课程设计第10页System.out.println(Thread.currentThread().getName()+线程完成自己的任务,该线程消亡!);}}publicclassProducerConsumer{publicProducerConsumer(){}publicstaticvoidmain(String[]args){Bufferbf=newBuffer();//初始化有界缓冲区Producerp=newProducer(bf);Consumerc=newConsumer(bf);//new生产者Threadthread_0=newThread(p);Threadthread_1=newThread(p);Threadthread_2=newThread(p);thread_0.setName(ProducerThread_0);thread_1.setName(ProducerThread_1);thread_2.setName(ProducerThread_2);Threadthread_3=newThread(c);Threadthread_4=newThread(c);thread_3.setName(ConsumerThread_0);thread_4.setName(ConsumerThread_1);System.out.println(生产消费模拟开始:);thread_0.start();thread_1.start();湖北中医学院信息技术系操作系统课程设计第11页thread_2.start();thread_3.start();thread_4.start();}}十、总结对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,HelloWorld!都是最经典的例子。在此之前,我们学习过java中的多线程机制,可是那时候的线程机制是简单且较为容易理解的,但是这次实验不一样,它要求用多个线程,于是我很长一段时间都在犯迷糊,不知道如何下手,花了很多时间去查阅资料,从开始的一个线程,调试通过,然后试着增加一个线程,慢慢地调试,最终步履蹒跚的完成了这次实验,从这次编程中我学到了很多知识,原来看似明白的、其实我也没有真正的搞懂,我想,学到的知识是一定要在实际应用中才能掌握的更为透彻。十一、参考文献操作系统原理第四版-庞丽萍编著面向对象与Java程序设计-朱福喜编著网上查阅的资料
本文标题:课程设计-生产者消费者问题
链接地址:https://www.777doc.com/doc-5464252 .html