操作系统课程设计多线程_第1页
操作系统课程设计多线程_第2页
操作系统课程设计多线程_第3页
操作系统课程设计多线程_第4页
操作系统课程设计多线程_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

燕山大学课程设计说明书————操作系统题目:多道程序缓冲区协调操作班级:计算机应用2班开发小组名称:Beyond软件开发小组课题负责人:张鹏课题组成员:姓名学号班级自评成绩张鹏090104010071应用2班A李倩090104010064应用2班B课题开发日期:2012.1.9—2012.1.13概述1.1课程设计目的本次课程设计的主要目的是通过模拟多道程序缓冲区协调操作,充分理解操作系统中进程、线程及线程间同步和互斥的概念;并通过自己编写程序了解软件开发流程,锻炼自己的编程能力,充分提高自己的综合能力。1.2主要完成任务模拟设定PUT、GET、Move操作的如下图所示,有多个PUT操作要不断循环地向Buffer1送数据,有Move1操作和Move2操作要不断地将Buffer1的数据取到Buffer2和Buffer3,有多个GET操作要不断地从Buff2和Buffer3中取数据。PUT、MOVE、GET每次操作一个数据,为了在操作的过程中要保证数据不丢失,每个Buffer每次只能接受一个PUT或一个Move或一个Get,多个操作不能同时操作同一BUFFER。Get2Get2PutMove2Buff1Buff2Buff3Move1Get1PUTMOVEGET软件能显示各个Buffer的操作过程和每个Buffer中的现有数据,放入、取出的总数据,可以设置Buffer的容量及放入、取出数据的速度,设置put、move、get操作的线程数和操作速度,软件结束运行时可以显示汇总数据,并能将统计结果保存到任意的路径下。1.3解决的主要问题 在本次课程设计中解决的重要问题有线程间的同步和互斥问题,java语言软件设计中面向对象思想各个类的创建方法及类之间互相操作问题,软件界面设计问题。2.设计使用的基本概念和原理2.1多道程序多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使他们在管理程序控制下,相互穿插运行。2.2进程进程是并发程序的执行,是多道程序系统中程序的执行过程。2.3线程线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,只拥有一点运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的资源。2.4同步和互斥相互合作的进程需要在某些点上协调,先到达某点的进程需要等待后到达的进程,进程间的这种协调关系叫同步。互斥是一种特殊的同步方式。当多个进程需要使用相同的资源,而次资源在任意时刻却只能供一个进程使用。获得资源的进程可以继续执行,没有获得资源的进程必须等待。进程间的这种相互排斥关系叫做互斥。2.5基本原理设计的基本理念是运用面向对象技术,设计三个缓冲区类Buffer1,Buffer2,Buffer3,主要属性有容量,当前数据量,放入、取出数据量,放入、取出速度等,主要方法有放入、取出等;然后设计线程类Producer,Transporter1,Transporter2,Consumer1,Consumer2,主要属性有线程个数,线程操作速度,主要方法是重新run()方法,调用相应Buffer的put和get方法,执行对Buffer的操作。利用信号量机制,对线程进行等待,唤醒操作,实现线程间的同步和互斥;利用线程的休眠时间来模拟放入,取出的速度以及各个线程操作的速度。3.总体设计3.1基本技术路线本程序主要利用面向对象编程方法,采用java提供的多线程技术,来模拟实现P、V操作。3.2总体结构、模块关系本程序中Producer线程可以调用Buffer1的put方法向Buffer1中放入数据;Transporter1线程可以调用Buffer1的get方法,调用Buffer2的put方法,将数据从Buffer1中取出放入Buffer2中;Transporter2线程可以调用Buffer1的get方法,调用Buffer3的put方法,将数据从Buffer1中取出数据放入Buffer3中;Consumer1线程可以调用Buffer2的get方法,从Buffer2中取出数据;Consumer2线程调用Buffer3的get方法,从Buffer3中取数据。程序运行前可以在设置中设置各个参数的值;程序运行中会在主界面显示各个Buffer中的操作,以及各个Buffer中的数据信息,包括现有数据,放入数据和取出数据,还能显示程序运行时间;程序运行结束后可以在菜单中点击统计按钮,查看所有数据的统计结果,并能保存结果到任意文件中。3.3总体流程3.31各个界面截图主界面截图数据统计窗口(可以点击保存,保存到任意文件中)、参数设置和使用说明界面3.32总体流程图主界面主界面菜单时间显示退出系统结束运行启动程序信息显示菜单时间显示退出系统结束运行启动程序信息显示状态信息文件设置帮助操作过程状态信息文件设置帮助操作过程统计退出参数设置使用说明关于统计退出参数设置使用说明关于4.详细设计4.1主要类的描述4.11三个缓冲区类Buffer1、Buffer2、Buffer3三个类的内容类似,以Buffer1为例说明。主要属性:privateintbuffercount;//Buffer当前数据量privateintbuffernum;//Bufffer的容量privateintputnum=0;//放入数量privateintgetnum=0;//取出数量privatelongputtime=1000;//放入速度privatelonggettime=1000;//取出速度主要方法:publicsynchronizedvoidput()throwsInterruptedException{//put方法向Buffer中放数据,synchronized关键字确定只能有一个线程操作Bufferwhile(buffercount>=this.buffernum){//当前数量大于等于容量时等待this.wait();}try{Thread.sleep(this.getPuttime());}catch(InterruptedExceptione){}this.setBuffercount(++this.buffercount);//当前数据量加1this.setPutnum(++this.putnum);//放入数据量加1MainFrame.jTextArea1.append(Thread.currentThread().getName().toString()+""+getBuffercount()+"\n");//操作显示在主界面MainFrame.jTextField1.setText(Integer.toString(getBuffercount()).toString().trim());//当前数据量显示在主界面MainFrame.jTextField4.setText(Integer.toString(this.putnum));//放入数据量在主界面显示this.notifyAll();//唤醒所有等待的线程}publicsynchronizedvoidget()throwsInterruptedException{//put方法从Buffer中取数据while(buffercount<=0){//如果当前数据小于等于0等待this.wait();}try{Thread.sleep(this.getGettime());}catch(InterruptedExceptione){}this.setBuffercount(--this.buffercount);//当前数据量减1this.setGetnum(++this.getnum);//取出数据量加1MainFrame.jTextArea1.append(Thread.currentThread().getName().toString()+""+getBuffercount()+"\n");//操作显示在主界面MainFrame.jTextField1.setText(Integer.toString(getBuffercount()).toString().trim());//当前数据量显示在主界面MainFrame.jTextField7.setText(Integer.toString(this.getnum));//取出数据量显示在主界面this.notifyAll();//唤醒所有等待的线程}}4.12Producer类主要属性:privateintputnum=1;//put线程的数量private longtime=1000;//控制线程速度主要方法:publicvoidrun(){//重写接口Rannable中的run方法try{while(this.getRun()){Thread.sleep(this.gettime());buffer.put();//调用Buffer1的put方法}}catch(InterruptedExceptione){e.printStackTrace();}}4.13Transporter1和Transporter2类两个类类似以Transporter1为例说明。主要属性:privatelongtime=1000;//控制线程速度 privateintmovenum=1;//线程个数主要方法:publicvoidrun(){//重写接口Rannable中的run方法try{while(this.getRun()){Thread.sleep(this.gettime());buffer1.get();//调用Buffer1的get方法buffer2.put();//调用Buffer2的put方法}}catch(InterruptedExceptione){e.printStackTrace();}}4.14Consumer1和Consumer2类两个类类似以Consumer1为例说明。主要属性:privateintgetnum=1;//get线程的数量 Privatelongtime=1000;//线程的速度主要方法:publicvoidrun(){//重写接口Rannable中的run方法try{while(this.getRun()){Thread.sleep(this.gettime());buffer.get();//调用Buffer2的get方法}}catch(InterruptedExceptione){e.printStackTrace();}}4.15各个窗体类各个窗体类主要通过软件JBuilder2006画图,代码自动生成,然后写事件函数,以主页面为例说明。主要事件处理方法:publicvoidqiDong_actionPerformed(ActionEvente){//点击启动运行按钮后对应操作this.qidong.setEnabled(false);time.init();//初始化时间对象Threadt=newThread(time);t.start();Shezhi();//设置参数方法jTextArea1.setText("");//以下为清空主界面显示jTextArea2.setText("");jTextArea3.setText("");jTextField1.setText("");jTextField2.setText("");jTextField3.setText("");jTextField4.setText("");jTextField5.setText("");jTextField6.setText("");jTextField7.setText("");jTextField8.setText("");jTextField9.setText("");buffer1.setBuffercount(0);buffer1.setGetnum(0);buffer1.setPutnum(0);buffer2.setBuffercount(0);buffer2.setGetnum(0);buffer2.setPutnum(0);buffer3.setBuffercount(0);buffer3.setGetnum(0);buffer3.setPutnum(0);producer.running();//设置各个线程可以运行transporter1.running();transporter2.running();consumer1.running();consumer2.running();this.jMenuItem5.setEnabled(false);Threadproducers[]=newThread[producer.getPutnum()];//创建producer线程for(inti=0;i<producers.length;i++){producer.running();producers[i]=newThread(producer,"put_"+i);producers[i].start();}Threadtransporters1[]=newThread[transporter1.getMovenum()];//创建Transporter1线程for(inti=0;i<transporters1.length;i++){transporter1.running();transporters1[i]=newThread(transporter1,"tansporter1_"+i);transporters1[i].start();}Threadtransporters2[]=newThread[transporter2.getMovenum()];//创建Transporter2线程for(inti=0;i<transporters2.length;i++){transporter2.running();transporters2[i]=newThread(transporter2,"tansporter2_"+i);transporters2[i].start();}Threadconsumers1[]=newThread[consumer1.getGetnum()];//创建Consumer1线程for(inti=0;i<consumers1.length;i++){consumer1.running();consumers1[i]=newThread(consumer1,"consumer1_"+i);consumers1[i].start();}Threadconsumers2[]=newThread[consumer2.getGetnum()];//创建Consumer2线程for(inti=0;i<consumers2.length;i++){consumer2.running();consumers2[i]=newThread(consumer2,"consumer2_"+i);consumers2[i].start();}}publicvoidjieshu_actionPerformed(ActionEvente){//点击结束按钮的对应操作this.qidong.setEnabled(true);producer.stop();transporter1.stop();transporter2.stop();consumer1.stop();consumer2.stop();time.setstop();this.jMenuItem5.setEnabled(true);}publicvoidtuichu_actionPerformed(ActionEvente){//点击退出系统按钮对应操作System.exit(0);}publicvoidjMenuItem2_actionPerformed(ActionEvente){//点击文件—>统计按钮对应操作tj=newTongjiFrame(buffer1,buffer2,buffer3,producer,consumer1,consumer2,transporter1,transporter2);tj.setTitle("数据统计窗口");tj.setSize(600,400);tj.setVisible(true);}publicvoidjMenuItem1_actionPerformed(ActionEvente){//点击文件—>退出按钮对应操作System.exit(0);}publicvoidjMenuItem3_actionPerformed(ActionEvente){//点击帮助—>使用说明对应操作help=newHelpFrame();help.setSize(580,460);help.setTitle("使用说明书");help.setVisible(true);help.setResizable(false);}publicvoidjMenuItem4_actionPerformed(ActionEvente){//点击帮助—>关于按钮对应操作about=newAboutFrame();about.setVisible(true);}publicvoidjMenuItem5_actionPerformed(ActionEvente){//点击设置—>参数设置按钮对应操作shezhi.setVisible(true);}}5.编码设计5.1开发环境的设置和建立开发环境:操作系统为Windows7,开发软件为JBuilder2006.5.2程序设计时要注意的事项注意面向对象的程序设计思想,任何一个类都是一个对。线程间的同步互斥操作,必须注意数据的安全性保护。5.3关键插进的特点和使用程序开发时主要用到JBuilder2006中画图的功能,其他代码都是自己完成,没有用到其他插件。5.4解决的技术难点1、多线程之间的同步、互斥问题2、Buffer的数据的安全问题3、对各个线程放入取出速度的任意控制问题。6.测试时出现过的问题及其解决方法1、问题:界面显示不是预想大小解决方法:通过代码调整各个界面的大小2、问题:一个类中的方法修改另一个类的属性有错误解决方法:将那些属性设置为静态属性7.软件使用说明7.1基本功能程序运行后,再点击启动按钮之前可以在菜单参数设置中设置各个参数的值。点击启动按钮软件运行,可以在主界面显示各个Buffer中的操作以及各个Buffer中的状态信息,包括Buffer中的现有数

温馨提示

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

评论

0/150

提交评论