收藏 分享(赏)

第9章 多线程.ppt

上传人:hskm5268 文档编号:10036269 上传时间:2019-09-30 格式:PPT 页数:25 大小:405KB
下载 相关 举报
第9章 多线程.ppt_第1页
第1页 / 共25页
第9章 多线程.ppt_第2页
第2页 / 共25页
第9章 多线程.ppt_第3页
第3页 / 共25页
第9章 多线程.ppt_第4页
第4页 / 共25页
第9章 多线程.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、第9章 多线程,第9章 多线程,本章主要讲述如下内容: 多线程的概念; 线程的生命周期; 多线程编程中的常量和方法; 线程调度方法; 资源冲突与协调; 线程之间的通信。,Java中多线程的基本概念,在多线程模型中,多个线程共存于同一块内存中,且共享资源。每个线程分配有限的时间片来处理任务。由于CPU在各个线程之间的切换速度非常快,用户感觉不到,从而认为并行运行。,多线程的特点,多个线程在运行时,系统自动在线程之间进行切换;由于多个线程共存于同一块内存,线程之间的通信非常容易;Java将线程视为一个对象。线程要么是Thread类的对象,要么是接口Runnable的对象。,多线程的特点(续),当多

2、个线程并行执行时,具有较高优先级的线程将获得较多的CPU时间片;优先级是从0到10的整数,并且它仅表示线程之间的相对关系;多个线程共享一组资源,有可能在运行时产生冲突。必须采用synchronized关键字协调资源,实现线程同步。,多线程编程中常用的常量和方法,线程类Thread定义在java.lang包中;Thread类包含的常量有: (1) public static final int MAX_PRIORITY最大优先级,值是10。 (2) public static final int MIN_PRIORITY最小优先级,值是1。 (3) public static final int

3、 NORM_PRIORITY缺省优先级,值是5。,多线程编程中常用的常量和方法(续),常用方法: currentThread( ) 返回当前运行的线程对象,是一个静态的方法。 sleep(int n) 使当前运行的线程睡n个毫秒,然后继续执行,也是静态方法。 yield( ) 使当前运行的线程放弃执行,切换到其它线程,是一个静态方法。 isAlive( ) 判断线程是否处于执行的状态,返回值true表示处于运行状态,false表示已停止。 start( ) 使调用该方法的线程开始执行。 run( ) 该方法由start( )方法自动调用。,多线程编程中常用的常量和方法(续),常用方法: sto

4、p( ) 使线程停止执行,并退出可执行状态。 suspend( ) 使线程暂停执行,不退出可执行态。 resume( ) 将暂停的线程继续执行。 setName(String s) 赋予线程一个名字。 getName( ) 获得调用线程的名字。 getPriority( ) 获得调用线程的优先级。 setPriority(int p) 设置线程的优先级。 join( ) 等待线程死亡,若中断了该线程,将抛出异常。,多线程编程中常用的常量和方法(续),注意1:在创建线程对象时,缺省的线程优先级是5,一般设置优先级4到6之间,不要设置为10,否则其它线程将执行不到。 注意2:Java的调度器能使高

5、优先级的线程始终运行,一旦CPU有空闲,具有同等优先级的线程,以轮流的方式顺序使用时间片。,线程的生命周期,线程的生命周期,例9-1:单线程 源程序 运行,创建多线程的方法,方法1:通过Thread类的子类实现多线程。方法2:定义一个实现Runnable接口的类实现多线程。,创建多线程的方法(续),方法1:通过创建Thread类的子类实现多线程,步骤如下 : (1) 定义Thread类的一个子类。 (2) 定义子类中的方法run( ),覆盖父类中的 方法run( )。 (3) 创建该子类的一个线程对象。 (4) 通过start( )方法启动线程。例9-2: 源程序 运行,创建多线程的方法(续)

6、,方法2:通过接口创建多线程,步骤如下: (1)定义一个实现Runnable接口的类。 (2)定义方法run( )。Runnable接口中有一个空的方法run( ),实现它的类必须覆盖此方法。 (3)创建该类的一个线程对象,并将该对象作参数,传递给Thread类的构造函数,从而生成Thread类的一个对象。 注意这一步! (4)通过start( )方法启动线程。例9-3: 源程序 运行,创建多线程的方法(续),例9-3中需要注意的2点: (1) mt1.join( )是等待线程死亡,对该方法必须捕捉异常,或通过throws关键字指明可能要发生的异常。 (2) 对一个线程不能调用start( )

7、两次,否则会产生IllegalThreadStateException异常。,线程调度模型,线程调度程序挑选线程时,将选择处于就绪状态且优先级最高的线程。如果多个线程具有相同的优先级,它们将被轮流调度。例9-4:验证Java对多线程的调度方法。源程序 运行思考:在run()方法中,通过线程睡眠2个毫秒,模拟程序的执行。如果不睡眠,你知道输出什么结果吗?为什么?,资源冲突,多个线程同时运行虽然可以提高程序的执行效率,但由于共享一组资源,可能会产生冲突。例9-5: 源程序 运行,同步方法,Java通过关键字synchronized实现同步。当对一个对象(含方法)使用synchronized,这个对

8、象便被锁定或者说进入了监视器。在一个时刻只能有一个线程可以访问被锁定的对象。它访问结束时,让高优先级并处于就绪状态的线程,继续访问被锁定的对象,从而实现资源同步。 加锁的方法有两种: 锁定冲突的对象 锁定冲突的方法,同步方法(续),(1) 锁定冲突的对象。语法格式:,synchronized ( ObjRef )Block / 需要同步执行的语句体 锁定对象可以出现在任何一个方法中。,例如,修改程序9-5中的方法run( ) 如下:,public void run( ) synchronized(UserObj) UserObj.Play(num); 运行结果如下: 运行线程 NO:1 结束线

9、程 NO:1 运行线程 NO:2 结束线程 NO:2 运行线程 NO:3 结束线程 NO:3,同步方法(续),同步方法(续),(2) 锁定冲突的方法。语法格式:,synchronized 方法的定义,例:修改程序9-5中的方法Play( ) 如下: synchronized void Play(int n) / 中间的程序代码略,注意: (1) 对方法run( )无法加锁,不可避免冲突; (2) 对构造函数不能加锁,否则出现语法错误。,线程间通信,多线程通信的方法有两种:(1) 把共享变量和方法封装在一个类中实现;(2) 通过wait( )和notify( )方法实现。,通过封装共享变量实现线

10、程通信,例9-6:通过将共享变量封装在一个类中,实现线程通信 源程序 运行,通过系统方法实现线程通信,线程同步控制的第二种方法是采用如下几个系统方法: (1) wait( )方法:使一个线程进入等待状态,直到被唤醒。(2) notify( )方法:通知等待监视器的线程,该对象的状态已经发生了改变。 (3) notifyAll( )方法:唤醒从同一个监视器中用wait( )方法退出的所有线程,使它们按照优先级的顺序重新排队。例9-7:源程序 运行,线程调度建议,线程进入等待队列的方式有: 线程a正在使用某对象,线程b调用该对象的同步方法,则b进入队列; 调用wait( )方法使线程进入队列。 当一个同步方法调用返回时,或一个方法调用了wait( )方法时,另一线程就可访问冲突的对象。 线程调度程序在队列中选取优先级最高的线程。如果一个线程因调用wait( )而进入队列,则必须调用notify( )才能“解冻”该线程。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报