生产者和消费者课程设计基于Java可视化界面Word文档格式.doc
《生产者和消费者课程设计基于Java可视化界面Word文档格式.doc》由会员分享,可在线阅读,更多相关《生产者和消费者课程设计基于Java可视化界面Word文档格式.doc(14页珍藏版)》请在冰豆网上搜索。
7、培养学生对问题进行文字论述和文字表达的能力。
二、课程设计的内容及其要求
1、可利用临界区(CCriticalSection)、事件(CEvent)、信号量(CSemaphore)来实现进程的同步。
2、根据生产者和消费者问题的特性做好软件实现的需要分析。
3、可根据问题的实际需要,来改变对信号量的使用及数量和初值的赋值。
4、当系统运行时,能直观地、动态地反映当前进程或线程运行的状态和信号量的变化。
5、要求系统能满足多进程或多线程的互斥与同步。
6、要求在系统安全状态的前提下,兼顾各个进程或线程的公平。
三、课程设计的时间安排
课程设计总时间:
15学时
四、课程设计的实验环境
硬件环境:
CPUIntel(R)Core™2DuoT58002.0GHz,内存DDR22.00GB,
硬盘5400转160G,光驱16XDVD
软件环境:
Windows7旗舰版,JDK1.6.0_21
五、正文
1、实验程序的结构图(流程图);
开始
Produce
WaitBuffer
WaitProducts
Consume
Whileconsume
结束
Whileproduce
2、数据结构及信号量定义的说明;
(1)classThread
功能:
线程类,用于创建并执行线程
构造方法:
publicThread()
作用:
分配新的Thread对象。
(2)booleanavailable
信号量
传递生产者与消费者进程之间的开始和等待信号
(3)wait()
使程序处于等待状态
(4)sleep(intn)
使线程暂停n毫秒
3、实验的步骤;
(1)打开Windows系统自带的笔记本程序
在任务栏“开始”菜单内“搜索程序和文件”搜索栏内键入“记事本”或者使用快捷键Win+R,打开“运行”对话框,然后键入“notepad”即可快速打开“记事本”程序。
(2)创建源文件(类)
在记事本内依次创建窗口类(Window)、共享资源类(Share)、生产者类(Producter)、消费者类(Consumer)以及最后的程序入口接入类(PCmx),最后保存为PCmx.java源文件。
(3)编译源文件
使用快捷键Win+R打开“运行”对话框,键入“cmd”打开控制台窗口,并用DOS命令进入保存有程序源文件的目录,键入“JavacPCmx.java”进行编译,若有错误提示则按照提示对源文件进行查错更改,然后重新进行编译直至无错误提示。
(4)运行程序
编译成功后,在控制台界面(仍然为源程序目录)内,继续键入“JavaPCmx”,运行程序。
4、实验源程序关键算法
创建共享资源类(Share)
classShare{
privateintu;
privatebooleanavailable=false;
//信号量available
publicJTextAreajt=newJTextArea("
生产消费状态:
\n"
);
//构造成员方法get(),用于向共享资源内取资源
publicsynchronizedintget(){//使用“synchronized”关键字可以使进程同步
while(available==false){
try{wait();
}
catch(InterruptedExceptione){}
jt.append("
Share中没有资源,消费者等待……\n"
}
available=false;
notifyAll();
正在唤醒生产者生产……\n"
returnu;
//构造成员方法put(),用于向共享资源内放资源
publicsynchronizedvoidput(intvalue){//使用“synchronized”关键字可以使进程同步
while(available==true){
Share中已有资源,生产者等待……\n"
u=value;
available=true;
notifyAll();
jt.append("
正在唤醒消费者消费……\n"
创建生产者线程(Producer)
classProducerextendsThread{
privateShareshared;
publicStringjieguo[]=newString[11];
publicJTextAreajt=newJTextArea();
//构造方法并对私有成员变量赋值
publicProducer(Shares){
shared=s;
//重写父类方法
publicvoidrun(){
for(inti=1;
i<
11;
i++){
shared.put(i);
jieguo[i]="
生产者第"
+i+"
次生产"
+"
生产者的生产数据:
"
;
jt.append(jieguo[i]);
try{
sleep(1000);
}catch(InterruptedExceptione){}
创建消费者线程(Consumer)
classConsumerextendsThread{
publicJTextAreajt=newJTextArea();
//构造方法并对私有变量赋值
publicConsumer(Shares){
intvalue=0;
//默认十次循环,消费者将从共享资源内取出相应资源
for(inti=1;
value=shared.get();
jieguo[i]="
消费者第"
次消费"
消费者获得的生产数据:
+value+"
jt.append(jieguo[i]);
try{
}catch(InterruptedExceptione){}
}
5、实验运行图;
同步运行结果
互斥运行结果
6、实验结果分析;
只有在生产者生产了产品并将产品存放到缓冲池中消费者才能去消费,当缓冲池为空时消费者不能消费
六、结论(应当准确、完整、明确精练;
也可以在结论或讨论中提出建议、设想、尚待解决问题等。
)
七、参考文献
【1】邵丽萍,邵光亚,张后扬编著.Java语言程序设计,清华大学出版社。
2008年8月第3版
【2】汤小丹,梁红兵,哲凤屏,汤子瀛编著.计算机操作系统,西安电子科技大学出版社。
2007年5月第3版
八、指导教师评语
签名:
年月日
课程设计成绩
附:
课程设计源代码:
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
//窗口类
classwindowextendsJFrame{
publicJFramejf;
publicJPaneljp3;
publicScrollPanesp1,sp2,sp3;
publicContainerc;
window(){
jf=newJFrame();
jp3=newJPanel();
sp1=newScrollPane();
sp2=newScrollPane();
sp3=newScrollPane();
c=getContentPane();
c.setLayout(newGridLayout(2,2,10,10));
jf.add(c);
c.add(sp1);
c.add(sp2);
c.add(jp3);
c.add(sp3);
jf.setSize(400,300);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Share类
privateintu,jishu=0;
privatebooleanavailable=false;
publicJTextAreajt=newJTextArea("
==========生产消费状态==========\n\n"
//同步方法
publicsynchronizedintget(){
jishu++;
while(available==false){
try{wait();
catch(InterruptedExceptione){}
jt.append(jishu+"
Share中没有资源,消费者等待……\n"
available=false;
notifyAll();
正在唤醒生产者生产……\n"
returnu;
publicsynchronizedvoidput(intvalue){
jishu++;
while(available==true){
try{wait();
catch(InterruptedExceptione){}
jt.append(jishu+"
Share中已有资源,生产者等待……\n"
}
u=value;
available=true;
notifyAll();
jt.append(jishu+"
正在唤醒消费者消费……\n"
}
//互斥方法
publicinthget(){
jishu++;