欢迎来到天天文库
浏览记录
ID:22682181
大小:103.03 KB
页数:9页
时间:2018-10-30
《java生产者消费者问题》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、湖北中医学院信息技术系操作系统课程设计操作系统课程设计(一号黑体加粗)用多进程同步方法解决生产者-消费者问题(小二黑体加粗)院系:班级:学号:姓名:同组者:时间:第9页湖北中医学院信息技术系操作系统课程设计目录(小二黑体加粗)一、题目:3二、设计目的:3三、总体设计思想概述:3四、说明:3五、设计要求:3六、设计方案:3七、流程图:4八、运行结果4九、源程序7十、总结15十一、参考文献15第9页湖北中医学院信息技术系操作系统课程设计一、题目:(标题2,即三号黑体加粗)用多进程同步方法解决生产者-消费者问题。二、设计目的:通过研究Linux的进程机制和信号量实现生产者消费者
2、问题的并发控制。三、总体设计思想概述:1、生产者—消费者问题是一种同步问题的抽象描述。2、计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。3、而当某个进程释放资源时,则它就相当一个生产者。四、说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。五、设计要求:1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。2、生产者和消费者各有两个以上。3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。六
3、、设计方案:1、用Java编写程序,运行环境为Eclipse。2、抽象化生产者与消费者之间的关系,即用线程来产生数据或者使用数据,定义的类有:(1)、publicclassBufferLock(2)、classProducer第9页湖北中医学院信息技术系操作系统课程设计(3)、classConsumer3、然后继承Thread(线程)来实现多个生产者与多个消费者之间的关系:(1)、classProducerextendsThread(2)、classConsumerextendsThread4、还需要有一个缓冲区来存放数据,即通过缓冲区把生产者和消费者联系起来。5、syn
4、chronized关键字修饰方法,实现线程同步。七、流程图:创建“生产者”线程缓冲区是否阻塞“生产者”等待“消费者”取出缓冲区的数据创建“消费者”线程“消费者”阻塞缓冲区是否为空输入数据“生产者”生产产品后被唤醒NONOYES第9页湖北中医学院信息技术系操作系统课程设计八、运行结果1、截图一:2、截图二:第9页湖北中医学院信息技术系操作系统课程设计3、截图三:九、源程序publicclassBufferLock//加互斥锁的缓冲区{第9页湖北中医学院信息技术系操作系统课程设计privateintvalue;//共享变量privatebooleanisEmpty=true;
5、//value是否为空的信号量publicsynchronizedvoidput(inti)//同步方法{while(!isEmpty)//当value不空时,等待try{this.wait();//使调用该方法的当前线程等待,即阻塞自己}catch(InterruptedExceptione){}value=i;//当value空时,value获得值isEmpty=false;//设置value为不空状态notifyAll();//唤醒其他所有等待线程}publicsynchronizedintget()//同步方法{while(isEmpty)//当value空时,等
6、待try{this.wait();}catch(InterruptedExceptione){}isEmpty=true;//设置value为空状态,并返回值notifyAll();//唤醒其他所有等待线程returnvalue;}}classProducerextendsThread//生产者{privateBufferLockbuffer;publicProducer(BufferLockbuffer){this.buffer=buffer;}publicvoidrun(){第9页湖北中医学院信息技术系操作系统课程设计for(inti=1;i<=20;i++)//生产
7、者往缓冲区中写入数1~20{buffer.put(i);System.out.println(Thread.currentThread().getName()+"Producerput:"+i);}}}classConsumerextendsThread//消费者{privateBufferLockbuffer;publicConsumer(BufferLockbuffer){this.buffer=buffer;}publicvoidrun(){for(inti=1;i<=20;i++)//消费者从缓冲区中取数System.
此文档下载收益归作者所有