《Java面向对象程序设计(第4版)》课件chapter11 多线程.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《Java面向对象程序设计(第4版)》课件chapter11 多线程.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java面向对象程序设计第4版 Java面向对象程序设计第4版课件chapter11 多线程 Java 面向 对象 程序设计 课件 chapter11
- 资源描述:
-
1、教学目标教学目标11.1线程的概念11.2 线程的状态与生命周期11.3 线程优先级与线程调度策略11.3线程的创建和执行 11.3.1 Thread类和Runnable接口介绍 11.3.2通过继承Thread的子类创建线程 11.3.2 通过实现Runnable 接口创建线程教学目标教学目标11.4 线程同步 11.4.1 Synchonized同步关键字 11.4.2 Wait和Notify方法 11.4.3多线程同步的程序设计举例11.5 Daemon线程 11.6 死锁 11.1 11.1 线程的概念线程的概念nJava语言支持多线程机制n可开发出处理多个任务的功能强大的应用程序。n
2、并行任务的应用举例1.1.程序、进程与线程的概念程序、进程与线程的概念n 程序是一段静态的代码n 进程是程序一次动态执行的过程.它对应着从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程。进程是由操作系统来管理.n多线程:当需要在一个程序中同时执行几段代码时,以完成不同的任务,就会用多线程技术来实现.多线程由程序负责管理。11.1 11.1 线程的概念线程的概念 n线程是进程中可独立执行的子任务,一个进程可以含有一个或多个线程,每个线程都有一个唯一的标识符。n进程和线程的区别:n进程空间大体分为:进程空间大体分为:数据区,代码区,栈区,数据区,代码区,栈区,
3、堆区。多个进程的内部数据和状态都是完全独立堆区。多个进程的内部数据和状态都是完全独立的;的;n而线程共享进程的数据区,代码区,堆区,只有而线程共享进程的数据区,代码区,堆区,只有栈区是独立的,所以线程切换比进程切换的代价栈区是独立的,所以线程切换比进程切换的代价小。小。11.1 11.1 线程的概念线程的概念 文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序区段程序区段同时有数个地方在执行同时有数个地方在执行一个进程内的单线程一个进程内的单线程一个进程内的多线程的任务一个进程内的多线程的任务文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序
4、区段程序区段只有一个地方在执行只有一个地方在执行11.1 11.1 线程的概念线程的概念 11.2 11.2 线程的状态与生命周期线程的状态与生命周期 n一个线程的生命周期通常要经历五个状态:n创建状态(Born)、n就绪状态或可运行状态(Ready)、n运行状态(Running)、n阻塞状态(Blocked,Waiting,Sleeping)、n死亡状态(Dead)。线程的不同状态以及各状态之间转换的过程。线程的不同状态以及各状态之间转换的过程。R e a d yR u n n in gb lo c k e dS le e p in gW a itin gs t a r tI/o 请 求w
5、a i tnotifynotifyAll等待时间到期interrupt调 度时 间 片 用 完y i e l ds l e e p执 行 完 毕睡 眠 时 间 到 期i n t e r r u p tB o rn进 入 syn ch ro n ize d 语 句I/O 完成获得 lockinterrupt当 一 个th re a d 执 行 结 束(即 从ru n()方 法 返 回 时),将 到 达 死 亡状 态R e a d yR u n n in gb lo c k e dS le e p in gW a itin gs t a r tI/o 请 求w a i tnotifynotifyA
6、ll等待时间到期interrupt调 度时 间 片 用 完y i e l ds l e e p执 行 完 毕睡 眠 时 间 到 期i n t e r r u p tB o rn进 入 syn ch ro n ize d 语 句I/O 完成获得 lockinterrupt当 一 个th re a d 执 行 结 束(即 从ru n()方 法 返 回 时),将 到 达 死 亡状 态11.2 11.2 线程的状态与生命周期线程的状态与生命周期1.1.创建状态(创建状态(BornBorn)n Java语言使用Thread类及其子类的对象来表示线程。n当一个Thread类或其子类的对象被创建时,就处于新
7、建状态。例如,执行下列语句后线程就处于创建状态:Thread myThread=new Thread();11.2 11.2 线程的状态与生命周期线程的状态与生命周期 2.2.就绪状态(就绪状态(ReadyReady,又称作可运行状态可运行状态(R(Runnable )n处于新建状态的线程,通过调用start()方法执行后,就处于就绪状态。n 处于就绪状态的线程,将进入线程队列排队等待分配CPU时间片。n 另外原来处于阻塞状态的线程,被解除阻塞后也将进入就绪状态。例如,执行下列语句后,一个线程就处于就绪状态:Thread myThread=new Thread();myThread.start
8、();11.2 11.2 线程的状态与生命周期线程的状态与生命周期 3.3.运行状态(运行状态(RunningRunning)n当就绪状态的线程被调度并获得处理器资源时,便进入运行状态。n每一个Thread类及其子类的对象都有一个重要的run()方法。run()方法定义了这一线程的操作功能。n当线程对象被调度执行时,它将自动调用此线程对象的run()方法。n处于运行中的线程,因调用了方法yield()会自动放弃CPU而进入就绪状态。从而使其他就绪的线程有运行的机会。11.2 11.2 线程的状态与生命周期线程的状态与生命周期 4.4.阻塞状态(阻塞状态(BlockedBlocked)n一个正在
9、运行的线程在某些特殊情况下,如果被人为挂起或需要执行费时的输入输出操作时,将让出CPU并暂时中止自己的执行,进入阻塞状态(包括blocking、waiting和sleeping状态)。n阻塞时它不能进入排队队列。n只有当引起阻塞的原因被消除时,线程才可以转入就绪状态,重新进到线程队列中排队等待CPU资源,以便从原来终止处开始继续运行。11.2 11.2 线程的状态与生命周期线程的状态与生命周期 5.5.死亡状态(死亡状态(DeadDead)n处于死亡状态的线程不具有继续运行的能力。n线程死亡的原因:执行完run()方法体的最后一个语句并退出。11.3 11.3 线程优先级与线程调度策略线程优先
10、级与线程调度策略 1.1.线程的优先级线程的优先级n每个线程都有一个优先级(每个线程都有一个优先级(prioritypriority),数值范围:),数值范围:110110nThread.MIN_PRIORITYThread.MIN_PRIORITY(常量(常量1 1,最低优先级)最低优先级)nThread.NORM_PRIORITYThread.NORM_PRIORITY(常量值(常量值5,5,默认优先级)默认优先级)nThread.MAX_PRIORITYThread.MAX_PRIORITY(常量(常量10,10,最高优先级)。最高优先级)。n具有较高优先级的线程,完成的任务较紧急,因而
11、应优先于具有较高优先级的线程,完成的任务较紧急,因而应优先于较低优先级的线程分配处理器时间。较低优先级的线程分配处理器时间。n每个新创建线程均继承创建线程的优先级。每个新创建线程均继承创建线程的优先级。n线程的优先级的设置或读取线程的优先级的设置或读取:n用用ThreadThread对象的方法对象的方法setPriority(int priority)setPriority(int priority);n用用getPriority()getPriority()方法获得线程的优先级。方法获得线程的优先级。11.3 11.3 线程优先级与线程调度策略线程优先级与线程调度策略.线程的调度策略线程的调
12、度策略n线程调度器(thread scheduler)支持一种抢先式的调度策略:n当前线程执行过程中有较高优先级的线程进入就绪状态,则高优先级的线程立即被调度执行。n而具有相同优先级的所有线程采用轮转的方式,共同分配CPU时间片,这是大多数ava系统支持的分时概念。11.311.3线程的创建和执行线程的创建和执行nJava的线程相关的类在软件包java.langjava.lang中。n在程序中实现多线程有两种方式:n创建Thread类的子类n或实现Runnable接口。n这两种方式都要两个关键性的操作:(1)定义用户线程的操作,即实现线程的run()方法的方法体;(2)构造Thread类对象,
13、实现线程的建立和运行控制。11.3.1 Thread11.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍 1 1RunnableRunnable接口介绍接口介绍nRunnable接口只有一个方法接口只有一个方法run()n所有实现所有实现Runnable接口的类必须实现这个方法。接口的类必须实现这个方法。它定义了线程体的具体操作。当线程被调度并它定义了线程体的具体操作。当线程被调度并转入运行状态时,它所执行转入运行状态时,它所执行run()方法中规定的方法中规定的操作。操作。2 2ThreadThread类介绍类介绍nThread类是一个具体的类,它封装了一个线程
14、所类是一个具体的类,它封装了一个线程所需要需要的属性和方法。的属性和方法。nThread类实现类实现Runnable接口中的接口中的run方法方法,但方但方法体为空。法体为空。11.3.1 Thread11.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍3 3ThreadThread类的构造方法类的构造方法n Thread(String threadName)Thread(String threadName)为新创建的线程对象指定一个字符串名称为新创建的线程对象指定一个字符串名称threadNamethreadName。nThread()Thread()线程对象的
15、名称由系统指定为线程对象的名称由系统指定为“Thread-Thread-”连接一个数值。连接一个数值。如如“Thread-1Thread-1”、“Thread-2Thread-2”n Thread(Runnable target)Thread(Runnable target)以实现以实现RunnableRunnable接口的接口的targettarget对象中所定义的对象中所定义的run()run()方法,方法,来初始化或覆盖新创建的线程对象的来初始化或覆盖新创建的线程对象的run()run()方法。方法。nThread(Runnable target,String ThreadName)Th
16、read(Runnable target,String ThreadName)nThread(ThreadGroup group,Runnable target,String Thread(ThreadGroup group,Runnable target,String name)name)11.3.1 Thread11.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍n利用构造函数创建新线程对象之后,进入线程的生命周期的第一个状态新建状态。n接着调用线程的start()方法,将启动线程对象n使之从新建状态转入就绪状态并进入就绪队列排队。11.3.1 Thread1
17、1.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍 4 4ThreadThread类的常用方法类的常用方法(1 1)ThreadThread类的的的静态方法类的的的静态方法nstatic Thread currentThreadstatic Thread currentThread()()返回当前正在运行线程的引用。返回当前正在运行线程的引用。nstatic void yieldstatic void yield()():使当前正在运行的线程暂使当前正在运行的线程暂时中断,变为就绪状态,以让其它线程有运行的机会。时中断,变为就绪状态,以让其它线程有运行的机会。n
18、static sleep(int)static sleep(int):以以millsecondmillsecond为单位,设置为单位,设置当前线程休眠时间。当前线程休眠时间。sleepsleep要抛出异常,必须捕获。要抛出异常,必须捕获。nstatic sleep(int millsecond,int nanosecond)static sleep(int millsecond,int nanosecond)设置以设置以millsecond(millsecond(毫秒毫秒)+nanosecond()+nanosecond(纳秒纳秒,十亿分之一秒十亿分之一秒)为单位的为单位的休眠时间。休眠时间。
19、11.3.1 Thread11.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍2 2)ThreadThread类的非静态方法类的非静态方法void start():启动已创建的线程对象void run():由线程调度器调用,当从run()返回时,该进程运行结果。final void setName(String name):设置线程的名字。final String getName():返回线程的名字。interrupt():中断线程对象所处的状态。final boolean isAlive():判断线程是否被启动.void join():使当前线程暂停运行,等调用
20、jion方法的线程运行结束,当前线程才继续运行。11.3.2 11.3.2 从从ThreadThread的派生子类创建线程的派生子类创建线程n创建用户定制的Thread类的子类,并在子类中重新定义自己的run()方法,这个run()方法中包含了用户线程的操作。11.3.211.3.2通过继承通过继承ThreadThread的子类创建线程的子类创建线程n例例11-1 11-1 通过定制的通过定制的ThreadThread的子类,创建多线程。的子类,创建多线程。该程序是一个Application程序,主线程是main()方法执行的路线。在主线程中创建三个线程,其名称是thread1、thread2
21、和thread3,每个线程的优先级均为默认的Thread.NORM_PRIORITY。每个线程启动后,由系统执行run()方法,运行将显示信息:进入睡眠的线程名称和要休眠的时间.。程序运行输出结果如图11-3 public class ThreadTester public static void main(String args)/创建和命名三个线程创建和命名三个线程 PrintThread thread1=new PrintThread(thread1);PrintThread thread2=new PrintThread(thread2);PrintThread thread3=new
22、 PrintThread(thread3);System.err.println(主线程将要启动三个线程主线程将要启动三个线程);thread1.start();/启动启动thread1,进入就绪状态,进入就绪状态 thread2.start();/启动启动thread2,进入就绪状态,进入就绪状态 thread3.start();/启动启动thread3,进入就绪状态,进入就绪状态 System.err.println(三个线程启动完成三个线程启动完成,主线程运行结束主线程运行结束n);class PrintThread extends Thread private int sleepTim
23、e;public PrintThread(String name)super(name);/通过调用父类构造方法给 thread 命名 sleepTime=(int)(Math.random()*5001);/设置睡眠时间0到5 秒 public void run()/设置线程运行的线程体 try System.err.println(getName()+进入睡眠状态,睡眠时间是:+sleepTime);Thread.sleep(sleepTime);catch(InterruptedException exception)System.err.println(getName()+睡眠醒来);
24、/显示线程名称 11.3.2 11.3.2 实现实现Runnable Runnable 接口创建线程接口创建线程n通过实现Runnable 接口创建线程的步骤:1.创建实现Runnable接口的类,在此类中实现Runnable接口中run()方法;2.创建此类的对象,并将此对象作为参数传递给 Thread类的构造方法,构造Thread对象并启动它。n只要一段代码在单独线程中运行,则可以继承Runnable接口,并将该段代码放在该接口run()方法中。11.3.2 11.3.2 实现实现Runnable Runnable 接口接口,创建线程创建线程n例例11-2 11-2 通过实现通过实现Run
25、nableRunnable接口创建线程接口创建线程n程序是一个Applet:实现一个时钟功能,时钟数据每隔1秒就变化一次。程序通过每隔1秒执行线程的刷新画面功能,显示当前时间。11.3.2 11.3.2 实现实现Runnable Runnable 接口接口,创建线程创建线程n类Clock继承了JApplet,并实现接口Runnable。n在JApplet的init方法中创建时钟线程对象并启动它;n在时钟线程对象启动后,运行run()方法;n在run()方法中,安排时钟线程睡眠1秒钟,1秒钟到期时,调用repaint()方法,以间接调用paint()方法,用以在Applet图形界面显示当前时间;
展开阅读全文