【精品】java与面向对象程序设计实验教程第7章 线程(可编辑.ppt
-
资源ID:86273142
资源大小:968.50KB
全文页数:29页
- 资源格式: PPT
下载积分:15金币
快捷下载

会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
【精品】java与面向对象程序设计实验教程第7章 线程(可编辑.ppt
Java与面向对象程序设计实验教程第7章 线程面向对象的程序设计对外经济贸易大学 雷擎content7.1多线程基础多线程基础7.2线程的生命周期线程的生命周期7.3生产者与消费者问题生产者与消费者问题实验:多线程实验:多线程面向对象的程序设计对外经济贸易大学 雷擎7.1多线程基础多线程基础o7.1.1线程的概念线程的概念o7.1.2Thread类和类和Runnable接口接口o7.1.3在程序中实现多线程在程序中实现多线程面向对象的程序设计对外经济贸易大学 雷擎7.1.1线程的概念线程的概念o线程和进程都是指正在执行的程序代码,是线程和进程都是指正在执行的程序代码,是与计算机中的并发执行相关的概念。与计算机中的并发执行相关的概念。o通过操作系统的调度,多个进程和线程可以通过操作系统的调度,多个进程和线程可以同时、独立的执行。同时、独立的执行。面向对象的程序设计对外经济贸易大学 雷擎o线程与进程的区别线程与进程的区别:n多个进程的内部数据和状态都是完全独立的多个进程的内部数据和状态都是完全独立的,而而多线程是共享一块内存空间和一组系统资源多线程是共享一块内存空间和一组系统资源,有有可能互相影响可能互相影响.n线程本身的数据通常只有寄存器数据,以及一线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。进程切换的负担要小。o多线程是多线程是Java的内嵌特性,的内嵌特性,Java虚拟机虚拟机允许应用程序并发地运行多个执行线程。允许应用程序并发地运行多个执行线程。线程线程与进程的区别与进程的区别面向对象的程序设计对外经济贸易大学 雷擎面向对象的程序设计对外经济贸易大学 雷擎面向对象的程序设计对外经济贸易大学 雷擎定定义一个一个Thread类的子的子类o步骤:步骤:n1.定义定义一个一个Thread类的子的子类,并并overriderun()方法,在这个方法里是你希望这个线程运行方法,在这个方法里是你希望这个线程运行的代码的代码n2.创建一个这个新类的对象创建一个这个新类的对象n3.调用调用Thread对象的对象的start()方法来启动线方法来启动线程程面向对象的程序设计对外经济贸易大学 雷擎实现实现Runnable接口接口o步骤:步骤:n1.定义一个类,实现定义一个类,实现Runnalbe接口,并接口,并overriderun()方法,在这个方法里是你希方法,在这个方法里是你希望这个线程运行的代码望这个线程运行的代码n2.创建一个这个新类的对象创建一个这个新类的对象n3.创建一个创建一个Thread类的对象,用刚才的类的对象,用刚才的Runnable对象作为构造函数参数对象作为构造函数参数n4.调用调用Thread对象的对象的start()方法来启动线方法来启动线程程面向对象的程序设计对外经济贸易大学 雷擎7.1.3在程序中实现多线程在程序中实现多线程o一个龟兔赛跑的例子,使用线程模拟了龟兔一个龟兔赛跑的例子,使用线程模拟了龟兔在在1000米赛跑过程。米赛跑过程。面向对象的程序设计对外经济贸易大学 雷擎1.定义一个定义一个Thread类的子类类的子类classRunnerextendsThreadStringname;doubledistance;Randomrand=newRandom();publicRunner(Stringname)this.name=name;面向对象的程序设计对外经济贸易大学 雷擎publicvoidrun()distance=0.0;for(inti=0;i10;i+)distance+=100.0;intsleepTime=rand.nextInt(2000);System.out.println(name+跑了跑了+distance+米米t休息休息+sleepTime+毫秒毫秒);tryThread.sleep(sleepTime);catch(InterruptedExceptioninte)System.out.println(name+跑到了终点跑到了终点);面向对象的程序设计对外经济贸易大学 雷擎使用定义好的使用定义好的Runner线程线程importjava.util.Random;publicclassDemoThreadSimplepublicstaticvoidmain(Stringargs)/创建并命名每个线程创建并命名每个线程Runnerrabbit=newRunner(rabbit);Runnertortoise=newRunner(“tortoise”);rabbit.setPriority(Thread.NORM_PRIORITY);tortoise.setPriority(Thread.NORM_PRIORITY+5);rabbit.start();/启动线程启动线程1tortoise.start();/启动线程启动线程1面向对象的程序设计对外经济贸易大学 雷擎2.实现实现Runnable接口接口classJumpBeanimplementsRunnableprivateintsleepTime;publicJumpBean()/构造方法构造方法sleepTime=(int)(Math.random()*6000);/获得随机休息毫秒数获得随机休息毫秒数面向对象的程序设计对外经济贸易大学 雷擎数组元素初始化的例子数组元素初始化的例子intaI;aI=newint10;StringaS;aS=newString3;CircleaC;aC=newCircle5;intk=0;for(k=0;k10;k+)aIk=k*k;aS0=aaa;aS1=newString(bbb);aS3=newString(ccc);for(k=0;k5;k+)aCk=newCircle();面向对象的程序设计对外经济贸易大学 雷擎publicvoidrun()trySystem.out.println(Thread.currentThread().getName()+goingtosleepfor+sleepTime);/区别区别:因为不是继承因为不是继承Thread类,因而必须先调用类,因而必须先调用currentThread方法方法Thread.sleep(sleepTime);/线程休眠线程休眠catch(InterruptedExceptionexception)System.out.println(Thread.currentThread().getName()+finished);/运行结束,给出提示信息运行结束,给出提示信息面向对象的程序设计对外经济贸易大学 雷擎构造并发执行的线程构造并发执行的线程publicclassDemoRunnableSimplepublicstaticvoidmain(Stringargs)/创建创建3个实现个实现Runnable接口类的对象接口类的对象JumpBeanthread1=newJumpBean();JumpBeanthread2=newJumpBean();JumpBeanthread3=newJumpBean();System.out.println(Startingthreads);/分别以三个对象为参数创建三个新线程,第二个参数为新线程命名并启动之分别以三个对象为参数创建三个新线程,第二个参数为新线程命名并启动之newThread(thread1,jumpbeanOne).start();newThread(thread2,jumpbeanTwo).start();newThread(thread3,jumpbeanThree).start();System.out.println(Threadsstarted,mainendsn);面向对象的程序设计对外经济贸易大学 雷擎publicclassMyArraypublicstaticvoidmain(Stringargs)intmyArray;/声明数组声明数组myArray=newint10;/创建数组创建数组System.out.println(IndexttValue);for(inti=0;imyArray.length;i+)System.out.println(i+tt+myArrayi);/证明数组元素默认初始化为证明数组元素默认初始化为0/myArray10=100;/将产生数组越界异常将产生数组越界异常数组引用例子数组引用例子面向对象的程序设计对外经济贸易大学 雷擎3.线程的优先权线程的优先权oJava的线程调度的优先级为的线程调度的优先级为1-10的整数,的整数,优先级随数的大小增减。优先级随数的大小增减。Thread类设置了类设置了特定的级别:特定的级别:nMIN-PRIORITYnNOM_PRIORITYnMAX-PRIORITYo某一时刻只有一个线程在执行某一时刻只有一个线程在执行,调度策略为调度策略为固定优先级调度固定优先级调度.nnewthread.setPriority(Thread.MIN_PRIORITY)面向对象的程序设计对外经济贸易大学 雷擎7.2线程的生命周期线程的生命周期o线程的生命周期是线程从产生到终止的全过线程的生命周期是线程从产生到终止的全过程,一个线程在任何时刻都处于某种线程状程,一个线程在任何时刻都处于某种线程状态。态。o一个线程的生命周期由线程类、新线程一个线程的生命周期由线程类、新线程(NewThread)、就绪状态()、就绪状态(Ready)、)、运行状态(运行状态(Running)、阻塞状态)、阻塞状态(Blocked)、等待状态()、等待状态(Waiting)和)和定时等待状态(定时等待状态(TimedWaiting)和终止)和终止状态(状态(Terminated)。)。面向对象的程序设计对外经济贸易大学 雷擎面向对象的程序设计对外经济贸易大学 雷擎7.3生产者与消费者问题生产者与消费者问题o生产者与消费者问题是从操作系统中的许多生产者与消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有代表性的问实际同步问题中抽象出来的具有代表性的问题,反映了操作系统中典型的同步例子。题,反映了操作系统中典型的同步例子。o生产者生产消息,放入消息缓冲区;消费者生产者生产消息,放入消息缓冲区;消费者从消息缓冲区中获取消息,使用消息。从消息缓冲区中获取消息,使用消息。面向对象的程序设计对外经济贸易大学 雷擎同步关系同步关系o生产者线程与消费者线程之间存在的同步关生产者线程与消费者线程之间存在的同步关系如下:系如下:n同一时刻只能有一个生产者或者一个消费者访同一时刻只能有一个生产者或者一个消费者访问消息缓冲区。问消息缓冲区。n当消息缓冲区为空时,消费者等待生产者生产当消息缓冲区为空时,消费者等待生产者生产消息;当消息缓冲区满时,生产者等待消费者消息;当消息缓冲区满时,生产者等待消费者消费消息。消费消息。面向对象的程序设计对外经济贸易大学 雷擎关键问题关键问题o生产者与消费者问题实现中的关键问题有:生产者与消费者问题实现中的关键问题有:n缓冲区采用数组实现的循环队列:缓冲区空的缓冲区采用数组实现的循环队列:缓冲区空的条件为条件为rear=front,缓冲区为满的条件为,缓冲区为满的条件为(rear+1)%size=front;n随机数对象随机数对象Randomrand=newRandom()用于产生线程等待的随机毫秒数;用于产生线程等待的随机毫秒数;n线程的退出:处于运行状态的线程通过置线程的退出:处于运行状态的线程通过置toStop标志为标志为true使线程从使线程从run()方法返回;方法返回;处于等待状态的线程由于无法自己醒过来,需处于等待状态的线程由于无法自己醒过来,需要置要置toStop标志为标志为true,主程序唤醒它们之,主程序唤醒它们之后才能检测到后才能检测到toStop标志。标志。面向对象的程序设计对外经济贸易大学 雷擎面向对象的程序设计对外经济贸易大学 雷擎小结小结7.1多线程基础多线程基础7.2线程的生命周期线程的生命周期7.3生产者与消费者问题生产者与消费者问题面向对象的程序设计对外经济贸易大学 雷擎知识点提示:知识点提示:o理解理解n线程的概念线程的概念n线程和进程的区别线程和进程的区别nJava多线程实现的机制多线程实现的机制n消费者和生产者的原理消费者和生产者的原理o掌握掌握n利用利用Thread和和Runnable实现多线程程序实现多线程程序面向对象的程序设计对外经济贸易大学 雷擎实验:多线程实验:多线程o实验实验11:多线程:多线程面向对象的程序设计EndofChapter7