操作系统生产者消费者问题实验报告.docx
- 文档编号:5314678
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:9
- 大小:222.80KB
操作系统生产者消费者问题实验报告.docx
《操作系统生产者消费者问题实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统生产者消费者问题实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
操作系统生产者消费者问题实验报告
操作系统生产者消费者问题实验报告
实验名称:
一、生产者-消费者问题的多线程解决方案
二、设计一个执行矩阵乘法的多线程程序
日期:
20XX-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;
else
returnqueue.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,b
fillRandom(matrix1);
fillRandom(matrix2);
staticvoidfillRandom(int[][]x)
{
for(inti=0;i { for(intj=0;j { //每个元素设置为0到99的随机自然数 x[i][j]=(int)(Math.random()*100); } } } (2)打印输出矩阵函数,主要代码如下: staticvoidprintMatrix(int[][]x) { for(inti=0;i { for(intj=0;j { System.out.print(x[i][j]+""); } System.out.println(""); } System.out.println(""); } (3)创建多线程类,并实现Runnable接口同步对矩阵进行分行计算,主要代码如下: //创建线程,数量<=4 for(inti=0;i<4;i++) { if(index { Threadt=newThread(newMyThread()); t.start(); }else { break; } synchronizedstaticintgetTask() { if(index { returnindex++; } return-1; } } classMyThreadimplementsRunnable { inttask; //@Override publicvoidrun() { MultiThreadMatrix.threadCount++; while((task=MultiThreadMatrix.getTask())! =-1) { System.out.println("进程: "+Thread.currentThread().getName()+"\t开始计算第"+(task+1)+"行"); for(inti=0;i { for(intj=0;j { MultiThreadMatrix.matrix3[task][i]+=MultiThreadMatrix.matrix1[task][j]*MultiThreadMatrix.matrix2[j][i]; } } } MultiThreadMatrix.threadCount--; } (4)通过不断改变矩阵大小,线程数目,,调试程序,运行结果: 五、所遇问题与解决方法 1.在生产者-消费者多线程试验中,刚开始没有考虑到使用线程睡眠,运行结果速度之快,没法观看数据变化,后面定义了睡眠控制,使得问题得以解决 2.在多线程矩阵开发实验中,刚开始定义矩阵太小,测试结果不太明显,后面通过把矩阵改大,并且线程数目不断变化使得结果明显。 六、实验总结 深刻了解了生产者消费者多线程,进一步理解了“生产者-消费者”模型。 同时也掌握了一些java编程语言相关知识。 多线程矩阵实验中,发现矩阵小时,线程越少,运行时间越长;而矩阵过大时,线程数量与运行时间成反比。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 生产者 消费者 问题 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)