并行计算实验报告一

2020-04-16 12:42

江苏科技大学

计算机科学与工程学院

实 验 报 告

实验课程:并行计算

实验名称:Java多线程编程

评定成绩 指导教师 宋英磊 学号: 姓名: 班级: 完成日期:2014年04月22日

1.1 实验目的

(1) 掌握多线程编程的特点; (2) 了解线程的调度和执行过程; (3) 掌握资源共享访问的实现方法。

1.2 知识要点 1.2.1线程的概念

(1) 线程是程序中的一个执行流,多线程则指多个执行流; (2) 线程是比进程更小的执行单位,一个进程包括多个线程;

(3) Java语言中线程包括3部分:虚拟CPU、该CPU执行的代码及代码所操作的数据。 (4) Java代码可以为不同线程共享,数据也可以为不同线程共享;

1.2.2 线程的创建

(1) 方式1:实现Runnable接口

Thread类使用一个实现Runnable接口的实例对象作为其构造方法的参数,该对象提供了run方法,启动Thread将执行该run方法; (2) 方式2:继承Thread类

重写Thread类的run方法;

1.2.3 线程的调度

(1) 线程的优先级

? 取值范围1~10,在Thread类提供了3个常量,MIN_PRIORITY=1、MAX_

PRIORITY=10、NORM_PRIORITY=5;

? 用setPriority()设置线程优先级,用getPriority()获取线程优先级; ? 子线程继承父线程的优先级,主线程具有正常优先级。

(2) 线程的调度:采用抢占式调度策略,高优先级的线程优先执行,在Java中,系统按照优先级的级别设置不同的等待队列。

1.2.4 线程的状态与生命周期

说明:新创建的线程处于“新建状态”,必须通过执行start()方法,让其进入到“就绪状态”,处于就绪状态的线程才有机会得到调度执行。线程在运行时也可能因资源等待或主动睡眠而放弃运行,进入“阻塞状态”,线程执行完毕,或主动执行stop方法将进入“终止状态”。

1.2.5 线程的同步--解决资源访问冲突问题

(1) 对象的加锁

所有被共享访问的数据及访问代码必须作为临界区,用synchronized加锁。对象的同步代码的执行过程如图14-2所示。

synchronized关键字的使用方法有两种:

? 用在对象前面限制一段代码的执行,表示执行该段代码必须取得对象锁。 ? 在方法前面,表示该方法为同步方法,执行该方法必须取得对象锁。 (2) wait()和notify()方法

用于解决多线程中对资源的访问控制问题。

? wait()方法:释放对象锁,将线程进入等待唤醒队列;

? notify()方法:唤醒等待资源锁的线程,让其进入对象锁的获取等待队列。 (3) 避免死锁

指多个线程相互等待对方释放持有的锁,并且在得到对方锁之前不会释放自己的锁。

1.3 上机测试下列程序

样例1:利用多线程编程编写一个龟兔赛跑程序。

? 乌龟:速度慢,休息时间短;

? 兔子:速度快,休息时间长;

【参考程序1】字符方式下实现方案

class Animal extends Thread { int speed; //速度

public Animal( String str,int speed) { super(str); //线程名用动物名代表 this.speed=speed; }

public void run() { int distance=0; int sleepTime;

while (distance<=1000) {

System.out.println(getName()+\ try {

distance+=speed; //每次跑的距离简单用速度计算

sleepTime=(int)( speed+Math.random()*speed); //速度快休息时间要长

sleep(sleepTime);

} catch (InterruptedException e) {} } } }

public class Race {

public static void main(String arg[]) { Animal a1, a2;

a1=new Animal(\ a2=new Animal(\

a2.setPriority(Thread.MAX_PRIORITY); //让乌龟的运行优先级更高 a1.start(); a2.start(); } } 【编程技巧】

(1) 速度快,跑的距离增加也快,这里简单地将速度加到距离上,未考虑跑的时间;

(2) 为了让乌龟得到更多的运行机会,采取两项措施,一让线程的睡眠时间与速度成正比,二是让乌龟得到更高的优先级。

【参考程序2】—图形方式下,图14-3为程序的运行演示。

public class runner extends Applet implements Runnable { int BeginX=10,EndX=200; //起点和终点的x坐标 int RabbitX = BeginX,RabbitY=100; //兔子的起点 int TortoiseX=BeginX, TortoiseY=200; //乌龟的起点 int RabbitRestTime=800,TortoiseRestTime=50; //各自休息时间 int RabbitSpeed=15,TortoiseSpeed=1; //各自速度

int state=0; //比赛状态, 0代表比赛进行中,1代表兔子赢,2代表乌龟赢 Thread rabbit; Thread tortoise; public void init() {

rabbit = new Thread(this,\创建名为rabit的线程 tortoise = new Thread(this,\创建名为tortoise的线程 }

public void paint(Graphics g) {

g.drawString(\龟\ g.drawString(\兔\ g.setColor(Color.red);

for(int j=70;j<=230;j+=10) g.drawString(\绘制终点线

g.setColor(Color.black);

if(state==1) g.drawString(\兔子赢了!!\ else if(state==2) g.drawString(\乌龟赢了!!\ }

public void start() {


并行计算实验报告一.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:肋骨骨折试的题目

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: