实验8 多线程编程

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验8--多线程编程

8.1 实验目的

(1) 掌握多线程编程的特点;

(2) 了解线程的调度和执行过程;

(3)掌握资源共享访问的实现方法。

8.2 知识要点

8.2.1线程的概念

(1)线程是程序中的一个执行流,多线程则指多个执行流;

(2)线程是比进程更小的执行单位,一个进程包括多个线程;

(3)Java语言中线程包括3部分:虚拟CPU、该CPU执行的代码及代码所操作的数据。

(4)Java代码可以为不同线程共享,数据也可以为不同线程共享;

8.2.2 线程的创建

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

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

(2)方式2:继承Thread类

重写Thread类的run方法;

8.2.3 线程的调度

(1) 线程的优先级

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

PRIORITY=10、NORM_PRIORITY=5;

●用setPriority()设置线程优先级,用getPriority()获取线程优先级;

●子线程继承父线程的优先级,主线程具有正常优先级。

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

8.2.4 线程的状态与生命周期

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

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

(1) 对象的加锁

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

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

●用在对象前面限制一段代码的执行,表示执行该段代码必须取得对象锁。

●在方法前面,表示该方法为同步方法,执行该方法必须取得对象锁。

(2) wait()和notify()方法

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

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

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

(3)避免死锁

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

15.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】—图形方式下,图

8-3为程序的运行演示。

import java.awt.*;

public class runner extends Applet implements Runnable {

int BeginX=200,EndX=400; //起点和终点的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);

}

相关文档
最新文档