




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验7-多线程编程7.1 实验目的(1) 掌握多线程编程的特点;(2) 了解线程的调度和执行过程;(3) 掌握资源共享访问的实现方法。7.2 知识要点7.2.1线程的概念(1) 线程是程序中的一个执行流,多线程则指多个执行流;(2) 线程是比进程更小的执行单位,一个进程包括多个线程;(3) Java语言中线程包括3部分:虚拟CPU、该CPU执行的代码及代码所操作的数据。(4) Java代码可以为不同线程共享,数据也可以为不同线程共享;7.2.2 线程的创建(1) 方式1:实现Runnable接口Thread类使用一个实现Runnable接口的实例对象作为其构造方法的参数,该对象提供了run方法,启动Thread将执行该run方法;(2) 方式2:继承Thread类重写Thread类的run方法;7.2.3 线程的调度(1) 线程的优先级l 取值范围110,在Thread类提供了3个常量,MIN_PRIORITY=1、MAX_ PRIORITY=10、NORM_PRIORITY=5;l 用setPriority()设置线程优先级,用getPriority()获取线程优先级;l 子线程继承父线程的优先级,主线程具有正常优先级。(2) 线程的调度:采用抢占式调度策略,高优先级的线程优先执行,在Java中,系统按照优先级的级别设置不同的等待队列。7.2.4 线程的状态与生命周期说明:新创建的线程处于“新建状态”,必须通过执行start()方法,让其进入到“就绪状态”,处于就绪状态的线程才有机会得到调度执行。线程在运行时也可能因资源等待或主动睡眠而放弃运行,进入“阻塞状态”,线程执行完毕,或主动执行stop方法将进入“终止状态”。7.2.5 线程的同步-解决资源访问冲突问题(1) 对象的加锁所有被共享访问的数据及访问代码必须作为临界区,用synchronized加锁。对象的同步代码的执行过程如图14-2所示。synchronized关键字的使用方法有两种: l 用在对象前面限制一段代码的执行,表示执行该段代码必须取得对象锁。l 在方法前面,表示该方法为同步方法,执行该方法必须取得对象锁。(2) wait()和notify()方法用于解决多线程中对资源的访问控制问题。l wait()方法:释放对象锁,将线程进入等待唤醒队列;l notify()方法:唤醒等待资源锁的线程,让其进入对象锁的获取等待队列。(3) 避免死锁指多个线程相互等待对方释放持有的锁,并且在得到对方锁之前不会释放自己的锁。7.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为程序的运行演示。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;jEndX) RabbitX=EndX; else if(currentRunning.equals(tortoise) /是乌龟try Thread.sleep(int)(Math.random()*TortoiseRestTime); catch(InterruptedException e) TortoiseX+=TortoiseSpeed; if(TortoiseX EndX) TortoiseX=EndX; if (RabbitX = EndX) state=1; else if ( TortoiseX = EndX) state=2; repaint(); 【编程技巧】(1) 创建两个代表兔子和乌龟的线程,根据线程名决定各自的速度和休息时间。(2) 根据是否到达终点决定state值的变化;(3) 线程的run方法内的循环条件是state值为0。样例2:编写一个使用继承Thread类的方式实现多线程的程序。该类有两个属性,一个字符串代表线程名,一个整数代表该线程要休眠的时间。线程执行时,显示线程名和休眠时间。另外,再定义一个测试类,该类创建多个线程对象以展示执行时间。【参考程序】class ThreadDemo extends Threadprivate String whoAmI;private int delay;public ThreadDemo(String s, int d)whoAmI = s;delay = d;public void run()tryThread.sleep(delay);catch(InterruptedException e)System.out.println(e.getMessage();System.out.println(Hello! I am + whoAmI + , I slept + delay+ milliseconds);public class MultiThreadpublic static void main(String args)ThreadDemo t1, t2, t3,t4,t5;t1 = new ThreadDemo(贝贝,(int)(Math.random()*1000);t2 = new ThreadDemo(晶晶,(int)(Math.random()*1000);t3 = new ThreadDemo(欢欢,(int)(Math.random()*1000);t4 = new ThreadDemo(盈盈,(int)(Math.random()*1000);t5 = new ThreadDemo(妮妮,(int)(Math.random()*1000);t1.start();t2.start();t3.start();t4.start();t5.start();【编程技巧】(1)在运行中利用随机数产生01s的休眠时间。(2)按题目要求,使用带两个参数的构造函数;7.4 上机练习 基本题1)编写一个多线程类,该类的构造方法调用Thread类字符串参数的构造方法,建立自己的线程名,然后随机生成一个休眠时间,再将自己的线程名和休眠多长时间显示出来。该线程运行后,休眠一段时间,改时间就是在构造方法中生成的时间。最后编写一个测试类,创建多个不同名字的线程,并测试其运行情况。class MyThread extends Threadint sleepTime;根据要求编写程序 提高题1) 编写生产者/消费者问题的应用程序。设缓冲区的大小为6.生产者以0200ms的速度随机产生30个小写字母,并将其放入缓冲区中,消费者以02s的速度取出字母,并显示在屏幕上。2) 加法程序。请编写一个程序,先产生一个大于10的随机整数n,再产生n个随即数并存放于数组中,然后将这n个数相加,并求出这n个数的和s1,同时计算出s1所需的时间t1。接着让程序创建两个线程并发地进行相加运算,其中,一个线程计算前一半数之和s21,另一个线程计算后一半数之和s22,然后将s21和s22这两个数相加得到和s2,计算采用双线程进行求和所花时间t2。请比较s1和s2,以及t1和t2的大小。注:在计算采用双线程求和的时间t2时,只要计算从创建双线程到最终得到s2的时间间隔就可以了。7.5 思考题1)什么原因可导致线程停止执行。A有更高优先级的线程开始执行;B线程调用了 wait()方法;C线程调用了yield()方法;D线程调用了 pause()方法;E线程调用了 sleep() 方法。2)哪个方法是实现Runnable接口所需的?Await() Brun() Cstop()Dupdate() Eresume()3)以下代码的调试结果为?public class Bground extends Threadpublic static void main(String argv) Bground b = new Bground(); b.run();public void start() for (int i = 0; i 10; i+) System.out.println(Value of i = + i); A编译错误,没有定义线程的run方法;B由于没有定义线程的run方法,而出现运行错误;C. 编译通过,运行输出 values 0 to 9 D. 编译通过,运行无输出4) 有关线程的叙述正确的有:A通过继承Thread类或实现Runnable接口,可以获得对类中方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 30174-2025机械安全术语
- 德州市驾驶证考试题库及答案
- 天水市一中开学考试题及答案
- 湖南城建职业技术学院单招模拟题(含解析)
- 2025年公营养师之三级营养师能力测试试卷附答案
- 2025年高处安装、维护、拆除作业考试题库及答案
- 编制说明-集成电路行业智慧零碳工厂评价技术规范
- 哲学与逻辑题库及答案
- 矿业招聘笔试题及答案
- 船员题库解答大全及答案
- 医院信息化建设中长期规划(十五五规划2025年)
- 患者的入院护理课件
- 聚磷酸铵阻燃剂市场分析报告
- 2024年全国导游资格考试《全国导游基础知识》真题和解析
- 香港公司章程范本中文
- 人教版高中地理选择性必修一-4.2洋流(第1课时)(教学设计)
- 古建筑修缮脚手架施工案例解析
- 认知障碍老人护理步骤
- 2025心肺复苏术(CPR)指南与实操
- 游艇消防安全培训课件
- 2024-2025学年人教版二年级体育下册全册教案
评论
0/150
提交评论