《Java语言编程基础》课件-第九章-多线程(电子版).ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《Java语言编程基础》课件-第九章-多线程(电子版).ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java语言编程基础 Java 语言 编程 基础 课件 第九 多线程 电子版
- 资源描述:
-
1、|线程与多线程|创建线程|线程的启动|线程的调度|线程的基本控制|多线程同步机制9.1 线程与多线程1线程的概念 线程是存在于程序中的一个单独的顺序执行流程。它类似于一个顺序执行的程序,即一个单独的线程也只有一个起始点、一个执行序列和一个结尾,在线程运行的某一特定时刻也只有一个执行点。但是,一个线程只是一个程序的一部分,它本身并不能构成一个完整的程序,换言之,程序可以独立运行,也可以拥有多个相互独立的线程,而线程则不然,它不能独立运行,也能不独立存在,而必须“寄生”于一个程序之中。 只包含一个线程的程序就是我们所熟悉的顺序执行程序,这时线程这一概念并未给我们带来什么新意。而Java使用线程的神
2、奇之处在于它使得一个程序可以使用多个线程,这些线程同时运行,而每个线程则完成不同的功能。2线程的结构 线程包含三个主要部分,第一是虚拟CPU本身,二是CPU执行的代码即Code,第三是代码操作的数据即Data。在Java中虚拟CPU体现于Thread类中。当一个线程被构造时;它由构造方法参数、执行代码、操作数据来初始化。应该特别注意的是,这三方面是各自独立的。一个线程所执行的代码与其它线程可以相同也可以不同,一个线程访问的数据与其它线程可以相同也可以不同。 二创建线程二创建线程1创建线程的方法之一继承Thread类 java.1ang.Thread是Java中用来表示进程的类,其中所定义的许多
3、方法为完成线程的处理工作提供了比较完整的功能。如果将一个类定义为Thread的子类,那么这个类也就可以用来表示线程。2创建线程的方法之二实现Runnable接口 Runnable是Java中用以实现线程的接口,从根本上讲,任何实现线程功能的类都必须实现该接口。前面所用到的Thread类实际上就是因为实现了Runnable接口,所以它的子类才相应具有线程功能的。Runnable接口中只定义了一个方法就是run()方法,也就是线程体。 Thread第二种构造方法中包含有一个Runnable实例的参数,这就是说,必须定义一个实现Runnable接口的类并产生一个该类的实例,对该实例的引用就是适合于这
4、个构造方法的参数。3关于两种创建线程方法的讨论适用于采用实现Runnable接口方法的情况 因为Java只允许单继承,如果一个类已经继承了Thread,就不能再继承其它类。在一些情况下,这就被迫采用实现Runnable接口的方法。比如对于Applet程序,由于必须继承java.applet.Applet,因此就只能采取这种实现接口的方法。再有,由于上面的原因而几次被迫采用实现Runnable接口的方法,可能会出于保持程序风格的一贯性而继续使用这种方法。适用于采用继承Thread方法的情况 当一个run()方法置于Thread类的子类中时,this实际上引用的是控制当前运行系统的Thread实例
5、,所以,代码不必写得像下面这样繁琐:Thread.currentThread().suspend();而可简单地写为:suspend(); 因为代码稍微简洁一些,所以许多Java程序员愿意使用继承Thread的方法。但是应该知道,如果采取这种简单的继承模式,在以后的继承中可能会出现麻烦。9.3 线程的启动线程的启动虽然一个线程已经被创建,但它实际上并没有立刻运行。要使线程真正在Java环境中运行,必须通过方法start()来启动,start()方法也在Thread类中。例如只要执行:Thread1.start();此时,线程中的虚拟CPU已经就绪,所以也可以把这一过程想象为打开虚拟CPU的开关
6、。9.4 线程的调度线程的调度 虽然就绪线程已经可以运行,但它并不意味着这个线程一定能够立刻运行。显然,在一台实际上只具有一个CPU的机器上,CPU在同一时间只能分配给一个线程做一件事。那么现在就必须考虑,当有多于一个的线程工作时,CPU是如何分配的。 在Java中,线程调度通常是抢占式,而不是时间片式。抢占式调度是指可能有多个线程准备运行,但只有一个在真正运行。一个线程获得执行权,这个线程将持续运行下去,直到它运行结束或因为某种原因而阻塞,再或者有另一个高优先级线程就绪。最后一种情况称为低优先级线程被高优先级线程所抢占。9.5 线程的基本控制线程的基本控制1结束线程 结束一个线程有两种情况,
7、第一种情况是当一个线程从run( )方法的结尾处返回时它自动消亡并不能再被运行,可以将其理解为自然死亡;另一种情况是利用stop( )方法强制停止,可以将其理解为强迫死亡,这种方法必须用于Thread类的特定实例中。2检查线程 有时候可能不知道一个线程的运行状态(当程序代码没有直接控制该线程时,会发生此种情况),这时可以利用方法isAlive( )来获取一个线程是否还在活动状态。活动状态不意味着这个线程正在执行,而只说明这个线程已被启动,并且既没有运行stop( ),也尚未运行完方法run( )。3挂起线程有几种方法可以用来暂停一个线程的运行。在挂起之后,必须重新唤醒线程进入运行,这从外表看来
8、好像什么也没发生,只是线程执行命令的速度非常慢。挂起线程的方法有以下几种:sleep( ) 方法sleep( )用于暂时停止一个线程的执行。通常,线程不是休眠期满后就立刻被唤醒,因为此时其它线程可能正在执行,重新调度只在以下几种情况下才会发生: 被唤醒的线程具有更高的优先级。 正在执行的线程因为其它原因被阻塞。 程序处于支持时间片的系统中。大多数情况下,后两种条件不会立刻发生。suspend( )和resume( ) 有时更好的办法是强制挂起线程,而不指定休眠时间,这种情况下由其它线程负责唤醒其继续执行。线程中有一对方法用于完成此功能,这就是suspend( )和resume( ) join(
展开阅读全文