并行计算实验报告一_第1页
并行计算实验报告一_第2页
并行计算实验报告一_第3页
并行计算实验报告一_第4页
并行计算实验报告一_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、江苏科技大学计算机科学与工程学院评定成绩指导教师宋英磊实验报告实验课程:并行计算实验名称:Java多线程编程班级:学号:姓名:完成日期:2014年04月22日精选文库精选文库 实验目的掌握多线程编程的特点;了解线程的调度和执行过程;掌握资源共享访问的实现方法知识要点1.2.1线程的概念线程是程序中的一个执行流,多线程则指多个执行流;线程是比进程更小的执行单位,一个进程包括多个线程;Java语言中线程包括3部分:虚拟CPU、该CPU执行的代码及代码所操作的数据。Java代码可以为不同线程共享,数据也可以为不同线程共享;线程的创建方式1:实现Runnable接口Thread类使用一个实现Runna

2、ble接口的实例对象作为其构造方法的参数,该对象提供了run方法,启动Thread将执行该run方法;方式2:继承Thread类重写Thread类的run方法;线程的调度线程的优先级取值范围110,在Thread类提供了3个常量,MIN_PRIORITY=1、MAX_PRIORITY=10、NORM_PRIORITY=5;用setPriority()设置线程优先级,用getPriority()获取线程优先级;子线程继承父线程的优先级,主线程具有正常优先级。线程的调度:米用抢占式调度策略,高优先级的线程优先执行,在Java中,系统按照优先级的级别设置不同的等待队列。线程的状态与生命周期绪状态”,

3、处于就绪状态的线程才有机会得到调度执行。线程在运行时也可能因资源等待或主动睡眠而放弃运行,进入“阻塞状态”,线程执行完毕,或主动执行stop方法将进入“终止状态”。1.2.5线程的同步-解决资源访问冲突问题对象的加锁所有被共享访问的数据及访问代码必须作为临界区,用synchronized加锁。对象的同synchronized关键字的使用方法有两种:用在对象前面限制一段代码的执行,表示执行该段代码必须取得对象锁。在方法前面,表示该方法为同步方法,执行该方法必须取得对象锁。wait()和notify()方法用于解决多线程中对资源的访问控制问题。wait()方法:释放对象锁,将线程进入等待唤醒队列;

4、notify()方法:唤醒等待资源锁的线程,让其进入对象锁的获取等待队列。避免死锁指多个线程相互等待对方释放持有的锁,并且在得到对方锁之前不会释放自己的锁1.3上机测试下列程序样例1:利用多线程编程编写一个龟兔赛跑程序。乌龟:速度慢,休息时间短;兔子:速度快,休息时间长;参考程序1】字符方式下实现方案classAnimalextendsThreadintspeed;/速度publicAnimal(Stringstr,intspeed)super(str);/线程名用动物名代表this.speed=speed;publicvoidrun()intdistance=0;intsleepTime;w

5、hile(distance=1000)System.out.println(getName()+isat+distance);trydistance+=speed;/每次跑的距离简单用速度计算sleepTime=(int)(speed+Math.random()*speed);/速度快休息时间要长sleep(sleepTime);catch(InterruptedExceptione)publicclassRacepublicstaticvoidmain(Stringarg)Animala1,a2;a1=newAnimal(rabit,100);a2=newAnimal(turtle,20);

6、a2.setPriority(Thread.MAX_PRIORITY);/让乌龟的运行优先级更高a1.start();a2.start();编程技巧】14-3龟兔赛跑的團蕙方式运行界面速度快,跑的距离增加也快,这里简单地将速度加到距离上,未考虑跑的时间;为了让乌龟得到更多的运行机会,采取两项措施,一让线程的睡眠时间与速度成正比,二是让乌龟得到更高的优先级。【参考程序2】一图形方式下,图14-3为程序的运行演示。publicclassrunnerextendsAppletimplementsRunnableintBeginX=10,EndX=200;/起点和终点的x坐标intRabbitX=Be

7、ginX,RabbitY=100;/兔子的起点intTortoiseX=BeginX,TortoiseY=200;/乌龟的起点intRabbitRestTime=800,TortoiseRestTime=50;/各自休息时间intRabbitSpeed=15,TortoiseSpeed=1;/各自速度intstate=0;/比赛状态,0代表比赛进行中,1代表兔子赢,2代表乌龟赢Threadrabbit;Threadtortoise;publicvoidinit()rabbit=newThread(this,rabbit);/创建名为rabit的线程tortoise=newThread(this

8、,tortoise);/创建名为tortoise的线程publicvoidpaint(Graphicsg)g.drawString(龟,TortoiseX,TortoiseY);g.drawString(兔,RabbitX,RabbitY);g.setColor(Color.red);for(intj=70;jEndX)RabbitX=EndX;elseif(currentRunning.equals(tortoise)/是乌龟tryThread.sleep(int)(Math.random()*TortoiseRestTime);catch(InterruptedExceptione)Tor

9、toiseX+=TortoiseSpeed;if(TortoiseXEndX)TortoiseX=EndX;if(RabbitX=EndX)state=1;elseif(TortoiseX=EndX)state=2;repaint();【编程技巧】(1)创建两个代表兔子和乌龟的线程,根据线程名决定各自的速度和休息时间。(2)根据是否到达终点决定state值的变化;线程的run方法内的循环条件是state值为0。样例2:编写选号程序,在窗体中安排6个标签,每个标签上显示09之间的一位数字,每位数字用一个线程控制其变化,点击“停止”按钮则所有标签数字停止变化。【参考程序】importjava.aw

10、t.*;importjava.awt.event.*;publicclassMyFrameextendsFrameMyLabelx=newMyLabel6;/安排6个标签,每个标签显示1个数字Buttoncontrol;publicMyFrame(Stringtitle)super(title);PaneldispnewPanel();disp.setLayoutnewFlowLayout();for(inti=0;i6;i+)xi=newMyLabel();disp.adx(i);newThread(xi).start();addCenter,disp);control=newButton(

11、停止);addNorth,control);pack();setVisibletrue);control.addActionListener(newActionListener()publicvoidactionPerformed(ActionEvente)for(inti=0;i6;i+)xi.stop=true;);publicstaticvoidmain(Stringargs)newMyFrame(Test);classMyLabelextendsLabelimplementsRunnableintvalue;booleanstop=false;publicMyLabel()super(

12、number);value=0;publicvoidrun()for(;)value=(int)(Math.random()*10);/产生一个0到9的数字setText(Integert.oString(value);tryThreads.leep(500);catch(InterruptedExceptione)if(stop)/停止标记为true,退出循环,结束运行break;【编程技巧】将每个标签定义为线程方式运行,在运行中利用随机数产生数字显示。线程体为一个循环语句,只有当stop标记变量为true,则停止;主程序中将所有标签定义存入一个数组,这样可以方便地对其进行控制,例如,在点击

13、“停止”按钮时将所有标签对象的stop属性值设置为true。1.4上机完成编程任务任务描述:完成下列编程任务,并将代码与实验报告一起交给教师。基本题(必做)编写一个可变颜色的标签,用一个按钮控制颜色的改变与停止。点击按钮颜色停止变化,再点击该按钮颜色又变化。颜色的变化可用随机数确定。有一个南北向的桥,只能容纳一个人,现桥的两边分别有10人和12人,编制一个多线程序让这些人到达对岸,每个人用一个线程表示,桥为共享资源。在过桥的过程中显示谁在过桥及其走向。编写一个图片播放程序,图片的文件名为file01.jpg,file02.jpg,filen.jpg,其中n由命令行输入,要求用多线程自动播放。提

14、高题(选做其中一个)编制一个秒针计时器,在画面包含一个文本框,显示秒针值,安排一个“开始”和“结束”按钮,点击“开始”按钮则开始计时,点击“结束”停止计时。时间的确定可借助日历对象实例方法实现,用get(Calendar.SECOND)方法得到秒值,用get(Calendar.MINUTE)方法得到分值,用get(Calendar.HOUR)方法得到小时值。计算从“开始”到“当前”的时间差即可确定花费的秒数。精选文库精选文库 【进一步思考】如何将秒针计时器设计为图形界面,绘制一个圆形秒表,秒表的一圈为60秒,根据花费的时间显示秒针的变化。编写生产者/消费者问题的应用程序。生产者以0200ms的

15、速度随机产生30个小写字母,消费者以02s的速度取出字母,并显示在屏幕上。利用多线程求解某范围素数,每个线程负责10000范围.线程1找1000-10000线程2找10001-20000线程3找20001-30000另开辟一线程专门接收其他线程发送给它的数据(创建管道输入输出流),直到3个线程发送的数据均结束(结束标记)为止,接受的数据以文本形式写入到文件xyz.dat中。1.5思考题(必做)任务描述:完成实验后,完成下列多选题什么原因可导致线程停止执行。有更高优先级的线程开始执行;线程调用了wait()方法;线程调用了yield()方法;线程调用了pause()方法;线程调用了sleep()

16、方法。哪个方法是实现Runnable接口所需的?Await()Brun()Cstop()Dupdate()Eresume()以下代码的调试结果为?publicclassBgroundextendsThreadpublicstaticvoidmain(Stringargv)Bgroundb=newBground();b.run();publicvoidstart()for(inti=0;i10;i+)System.out.println(Valueofi=+i);编译错误,没有定义线程的run方法;由于没有定义线程的run方法,而出现运行错误;编译通过,运行输出values0to9编译通过,运行无输出有关线程的叙述正确的有

温馨提示

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

最新文档

评论

0/150

提交评论