收藏 分销(赏)

《Java程序设计案例教程》教学课件08多线程并发编程.pdf

上传人:曲**** 文档编号:225277 上传时间:2023-03-08 格式:PDF 页数:36 大小:1.51MB
下载 相关 举报
《Java程序设计案例教程》教学课件08多线程并发编程.pdf_第1页
第1页 / 共36页
《Java程序设计案例教程》教学课件08多线程并发编程.pdf_第2页
第2页 / 共36页
《Java程序设计案例教程》教学课件08多线程并发编程.pdf_第3页
第3页 / 共36页
《Java程序设计案例教程》教学课件08多线程并发编程.pdf_第4页
第4页 / 共36页
《Java程序设计案例教程》教学课件08多线程并发编程.pdf_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、学习目标掌握有关线程的基本概念。掌握通过创建Thread类的子类和通过实现Runnable接口实现多线程的 方法。了解线程的状态和生命周期。了解线程优先级和线程调度。05了解线程同步的概念。技能目标2.能够在 MyEclipse IDE中编程实现Runnable接 口实现多线程。L 能够在 MyEclipseIDE中编程创建Thread类的,子类实现多线程。/3.能够在 MyEclipseIDE中编程实现线程同步。08回顾与思考多线程是Java的重要特性之一。如果一个程序是单线程的,那么,任何时刻都只 有一个执行点。这种单线程执行方法使系统的运行效率偏低,而且,由于必须依靠 中断来处理输入/输

2、出,所以,当出现频繁输入/输出或有优先级较低的中断请求时,实时性就变得很差。多线程系统可以避免这个缺点。所谓多线程,就是通过系统的 调用使几个具有不同功能的程序流即线程并行运行。多线程可以实现同一时刻执行 多个程序,使程序执行的效率变得更高。浏览器就是一个典型的多线程例子。在浏 览器中可以一边下载文件,一边播放音频和视频,一边打印文档等。多线程是实现 并发的一种有效手段。Java在平台上提供了对多线程的有效支持,利用语言和运行 支持系统提供的复杂同步机制,同时还确保了线程的安全性。8.2线程的使用8.2.1线程的基本结构表8-1 Thread类的常用构造方法及成员方法L继承Thread类(1)

3、Thread类。Thread 类是负责向其他类提供线程功 能的最主要的类,为了向一个 类增加线程功能,可以简单地 从Thread类派生一个类,并重 写run()方法。run()方法是线程 发生的地方,它常常被称为线 程体。Thread类的常用构造方 法及成员方法见表8-1。方 法方法的描述构造方法Thread()以默认值创建一个线程对象Thread(Runnable target)以定义Runnable接口的类对象创建一个线程对象Th read(String name)以指定的线程名创建一个线程对象Thread(Runnable targets String name)以定义Runnable接

4、口的类对象和指定的线程名创建一 个线程对象Thread currentThread()获得当前正在运行的线程对象String getName()获得线程名称int getPriorityO获得线程的优先级boolean isAliveC)测试线程是否运行结束void run()线程运行的主体,用户必须重写该方法void setName(String n)设置线程名称为nvoid setPriority(int n)更改线程的优先级为nvoid startO启动线程void yield()中止线程运行并将运行权交出void sleep(long n)使当前线程休眠n毫秒void joinO等待该

5、线程终止wait(long timeout)使线程等待,直到被唤醒notify()notifyAlK)唤醒指定线程或所有线程8.2线程的使用8.2.1线程的基本结构1.继承Thread类(2)用创建Thread类的子类实现多线程。若用这种 方法实现多线程,用户须在程序中创建Thread类的子类,并在子类中重写Thread类的run()方法来定义线程体以实现 线程的具体功能,然后创建该子类的对象以创建线程,当 用户创建的线程调用start。方法启动时,run()方法将被系 统自动执行。8.2线程的使用8.2.1线程的基本结构L继承Thread类【例81】通过定义Thread类的子类实现多线程。文

6、件名为Example8_Ljava,其代码 如下。运行结果如下。_其代码见P159-160。这是线程4!它的睡眠时间是100!这是线程3!它的睡眠时间是200!这是线程2!它的睡眠时间是300!这是线程1!它的睡眠时间是400!8.2线程的使用8.2.1线程的基本结构2.用实现Runnable接口实现多线程8.2线程的使用8.2.1线程的基本结构2.用实现Runnable接口实现多线程(1)仓!建实现Runnable接口的类ClassName。基本语法格式如下。class ClassName implements Runnable public void run()编写具体代码(2)创建Cla

7、ssName类的对象。基本语法格式如下。ClassName RunnableOb j ect=new ClassName();8.2线程的使用8.2.1线程的基本结构2.用实现Runnable接口实现多线程(3)用带有Runnable参数的Thread类构造方法仓!建线程对象,对象RunnableObject 作为构造方法的参数,作为新建线程的目标对象为线程提供run()方法。例如,用表8-1中列 出的构造方法Thread(Runnable target)创建线程对象。Thread Threadobject=new Thread(RunnableObject);Thread类中除了上述构造方法

8、带有 Runnable参数外,还有下面3个构造方 法也带有Ru nnabl e参数。Thread(Runnable target)Thread(ThreadGroup group,Runnable target)Thread(ThreadGroup group,Runnable target,String name)8.2线程的使用8.2.1线程的基本结构2.用实现Runnable接口实现多线程(4)启动定义的线程。基本语法格式如下。ThreadObject.start();与创建Thread类的子类实现多线程相比,通过Runnable接口实现多线程 方法为线程的创建提供了更大的灵活性。由于J

9、ava语言不允许多重继承,如果 采用创建Thread类的子类的方法创建新线程类,则该类不能再继承其他类,这就限制了程序的功能。而后一种方法却没有这方面的顾虑。8.2线程的使用8.2.1线程的基本结构2.用实现Runnable接口实现多线程【例82】通过实现Runnable接口实现多线程。文件名为Example8_2.java,其代码如下。其代码见P162-163。运行结果如下。我正在工作!我正在休息,喝咖啡!我正在工作!我正在工作!我正在工作!我正在工作!工作顺利完成!8.2线程的使用8.2.1线程的基本结构2.用实现Runnable接口实现多线程【例82】通过实现Runnable接口实现多线

10、程。文件名为Example8_2.java,其代码如下。其代码见P162-163。运行结果如下。我正在工作!我正在休息,喝咖啡!我正在工作!我正在工作!我正在工作!我正在工作!工作顺利完成!8.2线程的使用8.2.2线程的状态及调度每个Java程序都有一个默认的主线程。对于应用程序,主线程是main。方法执行的路径。对于Applet,主线程指挥浏览器加载并执行Java小程序。为实现多线程,必须在主线程中创建新的线程对象。Java线程是通过Java,lang包中的Thread类来实现的。可通过创建一个Th read类的对象来 产生一个新的线程。一个线程一旦产生,它就处于生命周期中的某一种状 态。

11、线程的状态表示了线程正在进行的活动及能够完成的任务。图8-1描述 了线程的生命周期及其状态转换。8.2线程的使用8.2.2线程的状态及调度start图8-1线程的生命周期及其状态转换出口从图8-1中可以看出,在一个线程从创建到消亡的整个生命周期中,总是处于下面5个状态中的某个状态。8.2线程的使用8.2.2线程的状态及调度11.新建状态:通过new关键字创建一个Thread类或其子类的线程对象时,该线程对象处于新建状态 o创建一个新的线程对象可以用下面的语句实现:Thread threadnew Thread();该语句是最简单的创建线程语句,但该语 句创建的线程是一个空的线程对象,系统还未

12、对这个线程分配任何资源8.2线程的使用8.2.2线程的状态及调度(2.就绪状态:就绪状态又可称为可运行状态。处于京 建状态的线程可通过调用sta代()方法来启动。sta rt()方法产生了线程运行所需要的系统资源 o启动后的线程将进入线程就绪队列排队等 待CPU服务,此时线程已经具备了运行的条 件,一旦获得CPU等资源,线程就可以脱离 创建它的主线程而独立运行。(3.运行状态:当处于就绪状态的线程被调度并获 得CPU资源时,线程就进入运行状态。每个线程对象都有一个重要的ru n()方法,run()方法定义了该线程的操作和功能o当线程对象被调度执行时,它将自动 调用其ru n()方法并从第一条语

13、句开始顺 次执行。8.2线程的使用8.2.2线程的状态及调度(4.阻塞状态:阻塞状态又称为不可运行状态。当发生下列情况之一时,线程就进入阻塞状态。(1)等待输入/输出操作完成。(4)调用了 suspend。悬挂方法。(2)线程调用wait()方法等待一个条件变量。(3)调用了该线程 的sleep。休眠方法。8.2线程的使用8.2.2线程的状态及调度消亡状态又称死亡状态。当调用run()方法结束后,线程就进入消亡状态,这是 线程的正常消亡。另外,线程还可能被提 前强制性消亡。不管何种情况,处于消亡 状态的线程都不具有继续运行的能力。8.2线程的使用8.2.3线程的控制多线程编程对于许多程序员来说

14、是一件棘手的事,特别是当运行的线程数量很多时,控 制这些线程相当困难。Java提供了线程组(java.Iang.ThreadGroup类)来控制线程,使同 时改变大量线程的运行状态成为可能。在创建线程之前,可 以仓!J 建一个 ThreadGroup 对象,下面的代码片段是 创建一个线程组,并在其 中加入两个线程的例子。ThreadGroup group=new ThreadGroup(n Queen bee);Thread tl=new Thread(group,Worker beel*);Thread t2=new ThreacK group,M Worker bee2);tl.start

15、();t2.start();当线程组被创建以后,每一个线程被创建并传递给 ThreadGroup对象,成为线程组中的成员。8.2线程的使用8.2.3线程的控制【例83】用线程组控制线程。文件名为Example8_3.java,其代码如下。某次运行的结果如下。_S_其代码见P166-167。其代码见P167-168。您8.3线程的管理8.3.1优先级Java中每个线程都有一个优先级,线程调度器根据优先天-二)的高低决定当前哪个线程先执行。优先级高的线程先执行,优 先级低的线程后执行。这样就可以为任务较紧急的重要线程设 置较高的优先级,在就绪队列中排在前面;反之,则设置较低 的优先级,等到优先级高

16、的线程执行结束后才被执行,让情况 紧急的线程首先得到调度。但若线程优先级相同,则遵循队列 媪 先进先出原则,即先到的线程先获得CPU资源执行。J8.3线程的管理8.3.1优先级在Java中,线程的优先级是用数字来表示的,其取值范围为110。另外,Thread类提 供3个有关线程优先级的静态属性,见表8-2。表8-2 Thread类定义的静态属性属性名属性的描述N()RM_PRIORITY代表普通优先级,默认为5MIN_PRIORITY代表最低优先级,通常为1MAX_PRIORITY代表最高优先级,通常为1008.3线程的管理8.3.1优先级当一个在就绪队列中排队的线程获得CPU资源而转入运行状

17、态后,则称这个线程被调度 o线程的调度遵循优先级基础上的抢先策略。抢先策略是指以下几个方面。(1)若一个比当前活 动线程优先级更高的线程 进入就绪状态,则停止当 前活动线程的执行,当前 活动线程转入阻塞状态,插入就绪队列中重新等待 调度,而优先级高的线程 转入运行状态,成为活动 线程。吞(3)若一个与当前活 动线程优先级相同的线程 进入就绪状态,则遵循 先到先服务的原则。(2)若一个比当前活动线程优先级低的线程进入就 绪状态,则当前活动线程不停止继续执行,刚进入就绪 状态的线程在就绪队列中等待调度。您8.3线程的管理8.3.2同步线程同步的基本思想是协调各线程对共享资源的使用,避免多个 线程在

18、某段时间内对同一资源的访问,这个资源可以是数据、代码、设备等。Java通过关键字synchronized来表明被同步的资源,即给资源加 锁,这个锁被称为信号锁。当某个资源被synchronized关键 字修饰时,系统在运行时都会分配给它一个信号锁,表明该资源在同 一时刻只能由一个线程访问。但是,处理线程同步仅仅定义信号锁是,Java中专门设计了以下3个方法与信号锁配合使用。您8.3线程的管理8.3.2同步O public final void wait()(等待方法)public final void notifyO(唤醒方法)该方法是一个最终方法,不 能被重写,只能在同步方法中被 调用。执行

19、该方法会将当前正在 运行的线程悬挂,释放所占用的 资源,从运行状态转入阻塞状态 进入wait队列等待被唤醒。该方法也是一个最终方法,不 能被重写,只能在同步方法中被调 用。执行该方法将唤醒wait队列中 优先级最高的一个线程,占有资源 运行。您8.3线程的管理8.3.2同步public final void notifyAII()(唤醒所有方法)除了notify。方法以外,Java还设计了notifyAII()方法。它的作用与notify。方法相似,不过它是唤醒wait队列中 所有的线程。wait。、notify。和notifyAII()3种方法必须在同步方 法中被调用。因此,它们只能出现在s

20、ynchronized作用 的范围内。8.3线程的管理8.3.2同步在Java中,用synchronized表示同步有两种形式:同步代码块和同步方法。(1)同步代码块。其基本语法格式如下。synchronize*someObject)代码其中,someObject代表当前对象。当程序 执行到synchronized设定的同步化区块时,锁 定当前对象,单独执行该同步化区块。8.3线程的管理8.3.2同步在Java中,用synchronized表示同步有两种形式:同步代码块和同步方法。(2)同步方法。其基本语法格式如下。访问控制修饰符synchronized返回值类型方法名(参数列表)语句序列;r

21、eturn表达式;在调用同步方法的线程执行结束前,其他调 用该同步方法的线程都会被阻塞。8.3线程的管理8.3.2同步【例8-4】生产者-消费者模型演示。文件名为Example8_4.java,其代码如下。_ 以下是某次运行结果。_A_其代码见P171-174。-i_其代码见P174-175。进程是程序从代码加载、执行到执行完毕的一个完整的动态执行过程。同时运行多个程序(任务)时称为多进程(多任务)。进程在执行过程中可 形成多条执行线索,每条线索称为一个线程。程序执行时,只有一条路线时 称为单线程。程序按几条不同的执行路线共同工作时称为多线程。Java语言 的一个重要功能特点就是内置对多线程的

22、支持。Java使用Thread类及其子类的对象来表示线程,线程的生命周期包括新 建、就绪、运行、阻塞、死亡等状态。多线程系统给就绪队列中的每个线程 自动分配线程的优先级,任务较重要的线程的优先级就较高;反之,则较低。优先级相同的线程遵循先到先服务原则。8.5习题1.选择题(1)以下说法正确的是()。A在创建Thread类的子类的过程中不能重写run()方法B.在Java应用程序中,用户无须引用run()方法C.sleepO方法和yield。方法者阿实现暂时停止一个线程的执行,两者的机理类似,没有太大区别D.多线程就是指多个程序在同时运行(2)以下有关线程状态之间的转换,转换途径合理的是(A.新

23、建状态一运行状态 B.阻塞状态一运行状态C.阻塞状态就绪状态 D.阻塞状态一死亡状态1.选择题(3)采用()方法可将被悬挂的线程恢复至运行状态。A.notifyO B.start()C.run()D.resume()(4)Java中声明同步化方法所使用的关键字是()。A.switch B.staticC.super D.synchronized2.用多线程求解从1累加到1 000o提示:设计两个线程,一 个线程计算从1累加到500,另一个线程计算从501累加到1 000,用join。方法协调这两个线程。8.5习题3.编程实现每隔1秒输出南京交通 职业技术学院中的一个字符。运行结 果如下。南南京

24、南京交南京交通南京交通职南京交通职业南京交通职业技南京交通职业技术 南京交通职业技术学 南京交通职业技术学院4.以下程序代码运行后弹出一个窗 口显示当前的时钟,如图8-2所示,补充 完整空缺的代码。图8-2习题4运行结果_立_其代码见P177-178。8.6上机实践_1.用继承Thread类的方法编程实现 每隔1秒钟向控制台输出自然数累加的结 果,加到20结束。2.用实现Runnable接口的方法编程 实现每隔1秒钟向控制台输出自然数累加 的结果,加到20结束。3.仔细阅读并分析下列程序代码,上机运行后有问题吗?为什么?4.修改上机实践3的代码,使运行结 果合理。其代码见P179-181。谢谢观看!

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 通信科技 > 软件工程

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服