您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 操作系统生产者消费者问题实验报告
实验报告二实验名称:一、生产者-消费者问题的多线程解决方案二、设计一个执行矩阵乘法的多线程程序日期:2015-10-22班级:13级计科学号:姓名:一、实验目的1.掌握线程的同步与互斥2.掌握生产者消费者的实现问题3.掌握多线程的编程方法4.掌握矩阵乘法的基本计算原理以及实现二、实验内容1.生产者-消费者问题的多线程解决方案2.设计一个执行矩阵乘法的多线程程序三、项目要求与分析1.请查阅资料,掌握线程创建的相关知识以及矩阵乘法的相关知识,了解java语言程序编写的相关知识2.理解线程的实验步骤在本次试验中,以“生产者-消费者”模型为依据,提供了一个多线程的“生产者-消费者”实例,编写java代码调试运行结果,得出相应的结论。理解矩阵乘法的实验步骤四、具体实现1.生产者-消费者实例(1)创建一个缓冲信息发送接收通道接口,并创建邮箱盒子类实现,主要代码如下://通道接口publicinterfaceChannel{publicabstractvoidsend(Objectitem);publicabstractObjectreceive();}//实现接口publicclassMessageQueueimplementsChannel{privateVectorqueue;publicMessageQueue(){queue=newVector();}publicvoidsend(Objectitem){queue.addElement(item);}publicObjectreceive(){if(queue.size()==0)returnnull;elsereturnqueue.remove(0);}}(2)创建一个工厂多线程类(启动生产者和消费者),并且添加main函数进行测试,主要代码如下://工厂类与主方法publicclassFactory{publicFactory(){ChannelmailBox=newMessageQueue();ThreadproducerThread=newThread(newProducer(mailBox));ThreadconsumerThread=newThread(newConsumer(mailBox));producerThread.start();consumerThread.start();}publicstaticvoidmain(String[]args){Factoryserver=newFactory();}(3)创建一个线程睡眠类,用于测试,主要代码如下:publicclassSleepUtilities{publicstaticvoidnap(){nap(NAP_TIME);}publicstaticvoidnap(intduration){intsleeptime=(int)(NAP_TIME*Math.random());try{Thread.sleep(sleeptime*1000);}catch(InterruptedExceptione){}}privatestaticfinalintNAP_TIME=5;(4)创建生产者类实现Runnable,主要代码如下:publicclassProducerimplementsRunnable{privateChannelmbox;publicProducer(Channelmbox){this.mbox=mbox;}publicvoidrun(){Datemessage;while(true){SleepUtilities.nap();message=newDate();System.out.println(Producerproduced+message);mbox.send(message);}}}(5)创建消费者类实现Runnable,主要代码如下:publicclassConsumerimplementsRunnable{privateChannelmbox;publicConsumer(Channelmbox){this.mbox=mbox;}publicvoidrun(){Datemessage;while(true){SleepUtilities.nap();message=(Date)mbox.receive();if(message!=null)System.out.println(Consumerconsumed+message);}}}(6)调试程序,运行结果:2.矩阵乘法实例(1)初始化矩阵(便于观察,这里使用随机数生成矩阵),主要初始化代码如下matrix1=newint[m][k];matrix2=newint[k][n];matrix3=newint[m][n];//随机初始化矩阵a,bfillRandom(matrix1);fillRandom(matrix2);staticvoidfillRandom(int[][]x){for(inti=0;ix.length;i++){for(intj=0;jx[i].length;j++){//每个元素设置为0到99的随机自然数x[i][j]=(int)(Math.random()*100);}}}(2)打印输出矩阵函数,主要代码如下:staticvoidprintMatrix(int[][]x){for(inti=0;ix.length;i++){for(intj=0;jx[i].length;j++){System.out.print(x[i][j]+);}System.out.println();}System.out.println();}(3)创建多线程类,并实现Runnable接口同步对矩阵进行分行计算,主要代码如下://创建线程,数量=4for(inti=0;i4;i++){if(indexm){Threadt=newThread(newMyThread());t.start();}else{break;}synchronizedstaticintgetTask(){if(indexm){returnindex++;}return-1;}}classMyThreadimplementsRunnable{inttask;//@Overridepublicvoidrun(){MultiThreadMatrix.threadCount++;while((task=MultiThreadMatrix.getTask())!=-1){System.out.println(进程:+Thread.currentThread().getName()+\t开始计算第+(task+1)+行);for(inti=0;iMultiThreadMatrix.n;i++){for(intj=0;jMultiThreadMatrix.k;j++){MultiThreadMatrix.matrix3[task][i]+=MultiThreadMatrix.matrix1[task][j]*MultiThreadMatrix.matrix2[j][i];}}}MultiThreadMatrix.threadCount--;}(4)通过不断改变矩阵大小,线程数目,,调试程序,运行结果:五、所遇问题与解决方法1.在生产者-消费者多线程试验中,刚开始没有考虑到使用线程睡眠,运行结果速度之快,没法观看数据变化,后面定义了睡眠控制,使得问题得以解决2.在多线程矩阵开发实验中,刚开始定义矩阵太小,测试结果不太明显,后面通过把矩阵改大,并且线程数目不断变化使得结果明显。六、实验总结深刻了解了生产者消费者多线程,进一步理解了“生产者-消费者”模型。同时也掌握了一些java编程语言相关知识。多线程矩阵实验中,发现矩阵小时,线程越少,运行时间越长;而矩阵过大时,线程数量与运行时间成反比。
本文标题:操作系统生产者消费者问题实验报告
链接地址:https://www.777doc.com/doc-1993300 .html