Java语言程序设计 教学课件 ppt 作者 于红 第9章_多线程

上传人:E**** 文档编号:89243105 上传时间:2019-05-21 格式:PPT 页数:29 大小:220.01KB
返回 下载 相关 举报
Java语言程序设计 教学课件 ppt 作者 于红 第9章_多线程_第1页
第1页 / 共29页
Java语言程序设计 教学课件 ppt 作者 于红 第9章_多线程_第2页
第2页 / 共29页
Java语言程序设计 教学课件 ppt 作者 于红 第9章_多线程_第3页
第3页 / 共29页
Java语言程序设计 教学课件 ppt 作者 于红 第9章_多线程_第4页
第4页 / 共29页
Java语言程序设计 教学课件 ppt 作者 于红 第9章_多线程_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《Java语言程序设计 教学课件 ppt 作者 于红 第9章_多线程》由会员分享,可在线阅读,更多相关《Java语言程序设计 教学课件 ppt 作者 于红 第9章_多线程(29页珍藏版)》请在金锄头文库上搜索。

1、第9章 多线程,9.1 多线程机制 9.1.1 基本概念 现代操作系统的重要特点是在保证安全的前提下,让程序能够并发执行,为了达到这一目的,操作系统中引入了进程的概念。程序是完成一定功能的指令串,是一个静态的概念;而进程是指一段程序对某一数据集合在处理机上的一次执行过程,是一个动态的概念,进程是有生命周期的。,如果把程序看成菜谱,进程就是某个厨师照着菜谱炒一次菜的过程;如果把程序看成钢琴曲谱,进程就是钢琴演奏者照着钢琴曲谱演奏一次钢琴曲的过程。引入了进程的概念之后,各种应用就可以并发执行,例如:用户可以在打印文档的同时听音乐、编辑源程序,此时,打印文档对应一个进程、播放音乐对应一个进程、编辑源

2、程序对应一个进程,这三个完成不同功能的程序并发执行。,但是,在许多情况下,用户要完成的任务具有很多相似的性质,例如:一个WWW服务器接受来自不同用户的网页访问请求,这些请求的处理可以并发执行,如果串行处理每个用户的请求,将会使得用户的等待时间过长。如果用进程来处理用户的网页访问请求,可以在一定程度上提高并发性,减少用户的等待时间,但是创建进程的开销太大,当用户数很多时,用户的等待时间依然很长,为了进一步减少系统开销,提高程序的执行效率,操作系统中引入了“线程”的概念。线程是进程的一部分,同一个进程的不同线程之间共享该进程的资源,不同线程之间的切换不需要进行进程上下文的切换,只需要进行CPU内部

3、的寄存器的切换,可以大大降低系统开销,提高运行效率。Java语言对多线程机制直接提供支持。,9.1.2 线程的状态 跟进程一样,线程也是有生命周期的,在线程的整个生命周期中,线程在各种不同的状态之间切换,一般的,线程有三种基本状态:就绪状态、运行状态和阻塞状态。 就绪状态:线程具有运行条件,此时线程已经获得除CPU以外的所有资源,只要线程调度程序将CPU的控制权交给线程,线程即可运行。 运行状态:线程所对应的代码在处理机上运行,此时,该线程拥有对CPU的控制权,除非该线程主动放弃CPU的控制权或者CPU控制权被更高优先级的线程抢占。,阻塞状态:当线程不具备继续运行的条件时,线程由运行状态变为阻

4、塞状态,处于阻塞状态的线程暂时无法进入就绪队列,处于阻塞状态的线程往往等待某些事情发生,当所等待的事情发生以后,该线程被唤醒,至于具体由什么事件唤醒阻塞线程,则取决于该线程的阻塞原因。例如:如果线程等待I/O,则I/O完成时,该线程被唤醒;如果线程等待其他线程传入的数据,则当数据传入后,该线程被唤醒;如果线程处于睡眠状态,则当睡眠时间结束后线程被唤醒。特别强调的是,处于阻塞状态的线程被唤醒之后就进入就绪队列。,在实际的系统中,考虑到各种不同的需求,有的系统中的线程具有五种基本状态:就绪状态、运行状态、阻塞状态、新建状态和死亡状态,其中就绪、运行和阻塞状态的定义前面已经叙述过,新建状态和死亡状态

5、的定义如下。 新建状态:线程已经创建但是还未启动运行,此时线程已经被分配了内存空间,私有数据已经被初始化,但是未被调度,所以还没有进入到就绪队列,此时该线程可以被调度变成就绪状态,也可以被杀死,变成死亡状态。 死亡状态:线程运行正常结束或非正常结束后,线程处于死亡状态。,图9-1描述了线程的状态及转换。,9.2 线程类和线程接口 Java语言实现多线程机制有两种方法:一种是继承Thread类,另一种是实现Runnable接口。 9.2.1 Thread类 在Java语言中,用Thread类或其子类创建线程对象,Thread类位于java.lang包中。程序员可以扩展 Thread类,但需要重写

6、父类的run方法,目的是规定线程的具体操作,否则线程就什么也不做,因为父类的run方法中没有任何操作语句。,1Thread类的构造方法 Thread类有四种格式的常用构造方法。 (1)public Thread():创建一个默认名字的线程对象。 (2)public Thread(Runnable target):由接口对象target创建一个默认名字的线程对象。 (3)public Thread(Runnable target,String name):由接口对象target创建一个名字为name的线程对象。 (4)public Thread(String name):创建一个名字为name的

7、线程对象。 (5)public Thread(ThreadGroup group, subThread, someThread,String name):创建一个名字为name的subThread类线程对象并将其放入线程组group中。 在创建线程时,用户可以根据需要选择合适的构造方法创建线程,关于线程组将在9.2.3节介绍。,2Thread类的其他常用方法 除构造方法外,Thread类的还提供了其他方法用于对线程进行控制,Thread类的其他常用方法如下: (1)public static Thread currentThread():返回当前正在运行的线程对象的引用。 (2)public

8、String getName():返回线程对象的名字。 (3)public int getPriority():返回线程对象的优先级。 (4)public void interrupt():中断线程对象。 (5)public static boolean interrupted():测试当前线程对象自身是否被中断过,该方法在判断的同时清除“线程中断”标记。 (6)public boolean isAlive():判断线程对象是否处于活动状态,若线程对象已执行过start()方法且还没有进入死亡状态,则返回true,否则返回false。 (7)public boolean isDaemon():

9、判断线程对象是否为守护线程,若该线程对象是一个守护线程,则返回true,否则返回false。 (8)public boolean isInterrupted():测试该线程对象是否被中断过,与interrupted方法不同的是,该方法不清除“线程中断”标记。,(9)public void join():用于阻塞线程。调用该方法的当前线程由运行状态变为阻塞状态,直到本线程进入死亡状态才可以唤醒被阻塞线程。 (10)public void join(long millis):用于阻塞线程。调用该方法的当前线程由运行状态变为阻塞状态,直到本线程进入死亡状态才可以唤醒被阻塞线程。但最多等待millis

10、 ms,如果已经等待了millis ms,不论本线程是否死亡,被阻塞线程都被唤醒。若参数millis值为0,则等同于join()。 (11)public void run():并发执行的Java程序的代码段。当run()方法执行完毕,该线程进入死亡状态。 (12)public void setDaemon(boolean on):将线程设置为守护线程或用户线程。若参数on的值为true,则将线程设置为守护线程,否则设置为用户线程。 (13)public void setName(String name):设置线程名字。 (14)public void setPriority(int newPr

11、iority):设置线程优先级。 (15)public static void sleep(long millis):将运行状态的当前线程转为就绪状态,使其睡眠millis ms。 (16)public void start():启动线程,将创建的线程由新建状态转为就绪状态,此时,线程具有运行条件,是否开始执行run()方法中的代码由线程调度程序决定。 (17)public static void yield():释放当前线程,使其放弃CPU进入就绪状态,给其他线程对象一个执行的机会。 (18)public void stop():强行终止线程,使线程由当前状态(可能为运行、阻塞或就绪)转为死

12、亡状态,不推荐使用该方法,因为该方法会导致产生异常。,3通过继承Thread类创建线程的格式 public class threadName extends Thread public void run() / 此方法必须重写 ,使用Thread类的子类创建线程的优点是:可以在子类中增加新的成员变量,使线程具有某种属性,也可以在子类中增加新的方法,使线程具有某种功能。总的来说,使用Thread类的子类创建线程优点是编写简单,可以直接操纵线程,缺点是Java不支持多继承,Thread类的子类只能继承Thread类,不能继承其他类,但有时实际系统中需要某个线程有多个父类,Java提供的Runnab

13、le接口可以满足这种需求。,9.2.2 Runnable接口 创建线程的另一个途径就是用Thread类直接创建线程对象。使用Thread创建线程对象时,通常使用的构造方法是:Thread(Runnable target),该构造方法中的参数是一个Runnable类型的接口,因此,在创建线程对象时必须向构造方法的参数传递一个实现Runnable接口类的实例,该实例对象是所创建线程的目标对象,当线程调用start方法后,一旦轮到它来使用CPU资源,自动调用接口中的run方法,这一过程是自动实现的,用户程序只需要让线程调用start方法即可,也就是说,当线程被调度并转入运行状态时,所执行的就是run

14、()方法中所规定的操作。,Runnable接口的定义如下: public interface Runnable public void run(); 该接口只定义了一个run()方法,用于存放作为线程运行的并发程序代码。已继承了其他类的类只要实现了这个接口,将并发运行的程序代码放在run()方法中,然后使用Thread类的构造函数就可以创建线程对象了。,使用Runnable接口的特点是:可以将Thread类与所要处理的任务分开,形成清晰的模型,还可以从其他类继承。 特别提示:若直接继承Thread类,在类内this即指当前线程。若使用Runnable接口,要在类中获得当前线程,必须使用静态Th

15、read方法currentThread()来获取对当前线程的引用。,9.2.3 线程组 线程组是线程集合。一般把具有类似功能的线程放在同一个线程组中进行统一管理,同一个线程组中的线程可以统一进行操作,例如,可以同时挂起或唤醒同一组里的所有线程。在创建线程时可以指定将线程放入某个线程组中,也可以由系统将它放入某个默认的线程组中,通常,默认的线程组就是创建该线程的线程组。线程一旦加入某个线程组,将一直是这个线程组的成员,不能将线程移出该线程组。线程组中可以包含线程或其他线程组,所有的线程和线程组构成了一颗以系统线程为根的树。,1线程组类ThreadGroup的构造方法 在Java语言中,用Thre

16、adGroup类创建线程组对象,ThreadGroup类位于java.lang包中。ThreadGroup类的构造方法格式如下: public ThreadGroup (String name):创建一个名字为name的线程组对象。,2ThreadGroup类的其他方法 除了构造方法以外,ThreadGroup类还提供了其他方法对线程组中的线程或线程组进行操作,主要方法包括: (1)getName():返回线程组的名字。 (2)getParent():返回父线程组的名字。 (3)activeCount():返回当前线程组中活动线程数,包括子线程组中的活动线程数。 (4)interrupt():向线程组及其子组中的线程发送中断信息。,(5)setMaxPriority(int pri):设置线程组的最高优先级,优先级为1至10之间的整数,优先级为1的优先级最低,优先级为10 的优先级最高。 (6)getMaxPriority():返回线程组的最高优先级。 (7)isDestroyed():判断线程组是否已经销毁。 (8)list():可以打印出与一个线

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号