ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:107.03KB ,
资源ID:1986271      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-1986271.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(生产者消费者问题java程序设计报告.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

生产者消费者问题java程序设计报告.docx

1、生产者消费者问题java程序设计报告重庆交通大学计算机操作系统课程设计报告班 级: 计软专业 2013 级 2 班 姓 名: 学 号: 课程设计题目: 生产者消费者问题 所 属 课 程 : 计算机操作系统 实验室(中心): 语音楼801 指 导 教 师 : 完 成 时 间 : 2015 年 11 月 25 日信息科学与工程学院课程设计成绩单课程名称:计算机操作系统 指导教师:刘洋姓名刘克性别男学号631306050224班级软件 130*综合成绩 程序运行情况 (占总成绩20%)能正确运行 基本能正确运行 能运行但结果不完善(20分) (15分) (10分)程序功能完善程度(占总成绩 10%)

2、完善 基本完善 不完善(10 分) (8 分) (5 分)程序结构的合理性(占总成绩 10%)合理 基本合理 不太合理(10 分) (8 分) (5 分)对问题的答辩情况(占总成绩 40%) 概念正确有创新 能正确回答所有问题 基本能正确回答(40 分) (35 分) (30 分)部分问题回答概念不清晰(20 分)学生的工作态度与 独立工作能力(占总成绩 10%)工作态度认真能独立完成任务 工作态度认真但独立性较差(10 分) (8 分)工作态度基本认真但缺乏独立性(5 分)设计报告的规范性(占总成绩 10%)符合规范 基本符合规范 规范性较差(10 分) (8 分) (5 分)重庆交通学院信

3、息科学与工程学院课程设计任务书课 程计算机操作系统班级软件2013级 2班指导教师刘洋题 目生产者消费者问题完成时间2015年6月 日至2015年11月 日主要内容利用程序界面模拟生产者消费者进程调度问题设计报告要求1封面;2课程设计成绩单、课程设计任务书3内容提要;4“课程设计报告”正文部分:主要应包括:问题分析和任务定义;环境简介;设计:主要是指数据结构与核心算法的设计描述;操作界面的设计;主要功能的算法框架;测试用例设计等内容。编译参数与步骤的说明;上机调试总结与分析;用户使用说明;测试数据与测试结果等内容。课程设计总结:可以包括课程设计过程的收获、遇到的问题及解决过程的思考、对数据结构

4、这门课程的思考和认识等内容。附录程序清单5参考文献版面要求1.题目用黑体三号,段后距18磅(或1行),居中对齐;2.标题用黑体四号,段前、段后距6磅(或0.3行);3.正文用小四号宋体,行距为1.25倍行距;4.标题按“一”、“”、“1”、“”顺序编号。指导时间安排星期周次一二三四五六17周18周指导地点一、 问题分析和任务定义(1)问题分析生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程即所谓的“生产者”和“消费者”在实

5、际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。(2)任务定义利用java写可视化程序,绘制三个矩形,分别表示生产进程、缓冲区、消费进程。定义一个栈作为缓冲区,栈的大小固定。定义两个线程分别控制生产过程和消费过程。生产过程:图片向右移动,移动到一定位置,表明生产完成。则向栈中压入一个元素。判断是否可以生产的标准是栈是否已经满,为此要定义一个IsFull函数来判断栈是否已满。如果已满则不可生产。消费过程:从栈中弹出一个元素放在消费

6、进程矩形之中,图片开始向右移动,移动出矩形则停止移动。二、 环境简介开发工具:eclipse操作系统:win10三、 设计(1) 界面设计如上图所示界面上有3个矩形,上面那个是生产矩形,中间的是缓冲区矩形,下面的是消费矩形。四个按钮分别是“开始生产”、“开始消费”、“停止生产”、“停止生产”、“停止消费”。(2) 算法设计定义一个栈来作为缓冲区,用来存储图片,定义一个生产者线程和一个消费者线程。两个线程分别控制图片的移动。生产者线程的图片一旦运动到一定位置,则向栈中压入一个图片元素,与此同时,缓冲区则显示一个产品。开始消费时,消费者线程则从栈中取出一个图片元素,这时缓冲区则减少一个产品,并且开

7、始在消费矩形中开始运动,运动到一定位置停止。定义update函数来更新界面显示内容:public void Update() int y=20,230,440; if(pictureProduce!=null) if(!Id.isEmpty() Id.lastElement().setBounds(20+(Id.size()-1)*125,230,120,120); pictureProduce.setBounds(x0, y0, 120, 120);/再次设置生产图片位置 else x0=20; b0=false;/为空则不能生产 /只要消费者图片不为空就可以显示 if(pictureCon

8、sume!=null) pictureConsume.setBounds(x1, y2, 120, 120); else x1=20; b1=false; /如果缓冲区满了,则不可生产 if(isfull() b0=false; repaint(); 定义set_x函数来控制图片横坐标位置:public boolean set_x(int i,int n) if(bi=true) /设置生产者与消费者的横坐标,不断向前 xi=n; /设置生产者生产完成回到起点 if(n=599&i=0) x0=20;/生产者回到起点 Id.push(pictureProduce);/添加到栈中添加一个产品,此

9、时缓冲区并没有产品 image=produce(); pictureProduce=new JLabel(image); add(pictureProduce); else if(n=20&i=1|n=599&i=1) if(n=20&i=1)/如果是可以消费 if(!Id.isEmpty()/当缓冲区不为空时,可以消费 pictureConsume=consume(); else pictureConsume=null; /System.out.println(n); if(x1=599&i=1) pictureConsume.setVisible(true); x1=20; return

10、true; else return false; 四、 上机调试总结与分析;调试结果显示:生产者消费者问题的基本功能已经实现,基本没有bug。五、 用户使用说明; 点击“开始生产”则图片开始运动,表示正在生产,图片运动出生产矩形之后,表示生产完成,此时缓冲区则显示一个图片。点击“停止生产”则生产进程停止。 点击“开始消费”则缓冲区会少一个产品,表示从缓冲区取走了一个产品消费,同时图片开始在消费矩形之中运动,运动出消费矩形之后停止。点击“停止消费”则消费进程停止。六、 测试数据与测试结果等内容。 测试结果如下:初始界面生产出一个产品之后继续生产一边生产一边消费七、 课程设计总结从这次的课程设计我

11、还是有很多收获的,首先是对于生产者消费者问题有了更深刻的了解,这个问题是典型的多线程问题,在学习java的时候,老师经常讲这个问题,但那时只是知道大概是什么意思。通过这次自己动手模拟这个问题,我才知道生产者消费者问题其实主要考虑缓冲区的问题,缓冲区满则不可生产,缓冲区空则不可消费。其次,我对于java的线程的使用也熟悉了很多,线程是java的重点和难点,但是我们平时并没有对于线程做很多的练习,所以对于线程可谓是一知半解。通过这次的实验,我使用了多线程的技术,对于的线程的应用方法以及编写方法有了比较深入的了解。以后再遇见线程问题应该可以游刃有余了。八、附录程序清单1.DrawPanel类代码im

12、port java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Stack;import java.util.function.Consumer;import javax.jws.soap.SOAPBinding.Style;import javax.swing.Icon;import javax.swing.ImageIcon;import javax

13、.swing.JButton;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.plaf.basic.BasicInternalFrameTitlePane.IconifyAction;import org.omg.CORBA.IRObjectOperations;public class DrawPanel extends JPanel implements ActionListener/面板类用于绘图及事件处理 private Icon image=null; private Stack Id=ne

14、w Stack();/定义一个栈,作为缓冲区 boolean b=new boolean2;/设置两个状态标识,b0为true是可以生产,b1为true是可以消费 private int max=7;/缓冲区最大值 private mythread threadProduce;/生产者线程 private mythread threadComsume;/消费者线程 private JButton btStartProduce; private JButton btnStartCosume; private JButton btnStopConsume; private JButton btnS

15、topProduce; private JLabel pictureProduce; private JLabel pictureConsume; /private JLabel nameAndId; int x=new int2; public int get_x(int i)/得到生产、消费横坐标 return xi; public boolean set_x(int i,int n) if(bi=true) /设置生产者与消费者的横坐标,不断向前 xi=n; /设置生产者生产完成回到起点 if(n=599&i=0) x0=20;/生产者回到起点 Id.push(pictureProduc

16、e);/添加到栈中添加一个产品,此时缓冲区并没有产品 image=produce(); pictureProduce=new JLabel(image); add(pictureProduce); else if(n=20&i=1|n=599&i=1) if(n=20&i=1)/如果是可以消费 if(!Id.isEmpty()/当缓冲区不为空时,可以消费 pictureConsume=consume(); else pictureConsume=null; /System.out.println(n); if(x1=599&i=1) pictureConsume.setVisible(true

17、); x1=20; return true; else return false; public ImageIcon produce() return new ImageIcon(C:UsersfffDownloads9b5edaa1b776898353c47675929cbd5d.jpg); public JLabel consume() return Id.pop(); public boolean isfull()/判断缓冲区是否已经满了 if(Id.size()=max) return true; else return false; public DrawPanel() try b0

18、=false;/初始状态既不可生产也不可消费 b1=false; x0=x1=20;/设置三个起始横坐标 int y=20,230,440; setLayout(null); image=produce(); pictureProduce=new JLabel(image);/为生产者图片赋值 pictureProduce.setBounds(x0, y0, 120, 120);/初始状态下的生产者图片位置 /实例化生产与消费者对象 threadProduce=new mythread(0, this); threadComsume=new mythread(1, this); /启动线程 t

19、hreadProduce.start(); threadComsume.start(); add(pictureProduce); btStartProduce=new JButton(开始生产); btStartProduce.addActionListener(this);/添加本类中的的 actionPerformed(ActionEvent arg0)方法 btnStartCosume=new JButton(开始消费); btnStartCosume.addActionListener(new ActionListener() Override public void actionP

20、erformed(ActionEvent arg0) / TODO Auto-generated method stub b1=true; ); btnStopConsume=new JButton(停止消费); btnStopConsume.addActionListener(new ActionListener() Override public void actionPerformed(ActionEvent e) / TODO Auto-generated method stub b1=false; ); btnStopProduce=new JButton(停止生产); btnSto

21、pProduce.addActionListener(new ActionListener() Override public void actionPerformed(ActionEvent e) / TODO Auto-generated method stub b0=false; ); add(btStartProduce); add(btnStartCosume); add(btnStopConsume); add(btnStopProduce); repaint(); catch (Exception e) / TODO: handle exception public void p

22、aint(Graphics g) super.paint(g); int y=20,230,440;/三个矩形的纵坐标 btStartProduce.setBounds(100,170,150,30); btnStartCosume.setBounds(100,600,150,30); btnStopConsume.setBounds(300,600,150,30); btnStopProduce.setBounds(300,170,150,30); g.setColor(Color.gray); g.drawRect(20, y0, 575, 120);/绘制生产矩形 g.drawRect(

23、20, y1, 870, 120);/绘制缓冲区矩形 g.drawRect(20, y2, 575, 120);/绘制消费矩形 g.setColor(Color.black); Font font=new Font(楷体, Font.BOLD, 20); g.setFont(font); g.drawString(631306050224 刘克 软件二班, 100, 390); /更新界面显示内容 public void Update() int y=20,230,440; if(pictureProduce!=null) if(!Id.isEmpty() Id.lastElement().s

24、etBounds(20+(Id.size()-1)*125,230,120,120); pictureProduce.setBounds(x0, y0, 120, 120);/再次设置生产图片位置 else x0=20; b0=false;/为空则不能生产 /只要消费者图片不为空就可以显示 if(pictureConsume!=null) pictureConsume.setBounds(x1, y2, 120, 120); else x1=20; b1=false; /如果缓冲区满了,则不可生产 if(isfull() b0=false; repaint(); Override public

25、 void actionPerformed(ActionEvent e) / TODO Auto-generated method stub try if(!threadProduce.isAlive()/唤醒生产线程 threadProduce.notify(); b0=true; catch (Exception e2) / TODO: handle exception repaint(); 2.mythread类代码public class mythread extends Thread private int id;/序号 private int n;/坐标位置 private Dra

26、wPanel panel; public mythread(int i,DrawPanel d) id=i; panel=d; public int get_n() return n; public void run() try while (true) n=panel.get_x(id);/得到初始位置 if(panel.set_x(id,n)/如果可以生产或者可以消费 panel.Update(); +n; n=n%600;/不断改变Xi,即生产或消费者的横坐标位置 Thread.sleep(4); panel.set_x(id,n); catch (Exception e) / TODO: handle exception 3.DrawFrame类代码import java.awt.Color;import java.awt.Container;import javax.swing.JFrame;public class DrawFrame extends JFrame public DrawPanel panel; public DrawFrame() set

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2