并行计算实验报告一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
江苏科技大学
计算机科学与工程学院
实验报告
实验名称: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()+"is at"+distance);
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("rabit",100);
a2=new Animal("turtle",20);
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,"rabbit"); //创建名为rabit的线程
tortoise = new Thread(this,"tortoise"); //创建名为tortoise的线
程
}
public void paint(Graphics g) {
g.drawString("龟",TortoiseX,TortoiseY);
g.drawString("兔",RabbitX,RabbitY);
g.setColor(Color.red);
for(int j=70;j<=230;j+=10) g.drawString("|",EndX+8,j); //绘制终
点线
g.setColor(Color.black);
if(state==1) g.drawString("兔子赢了!!",250,300);
else if(state==2) g.drawString("乌龟赢了!!",250,300);
}
public void start() {