项目9-利用多线程技术实现定时响铃课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《项目9-利用多线程技术实现定时响铃课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 项目 利用 多线程 技术 实现 定时 响铃 课件
- 资源描述:
-
1、项目9 利用多线程技术实现定时响铃古凌岚 张婵 罗佳人民邮电出版社JavaJava系统化项目开发教程系统化项目开发教程知识要点n 线程的生命周期n 线程的创建 n 线程并发控制n 线程通信引子 n 为什么需要引入线程?u日常生活中,我们人在同一时间可以做许多事,如在进餐的同时,还可以倾听朋友叙述的故事uJava程序中为了模拟这种功能,引入了线程机制。简单点说,当一个程序能够同时完成多件事情时,就是所谓的多线程程序u多线程应用较广泛9.1实战任务十一:实现闹钟启动的计时功能n 问题分析u设定闹钟涉及两个时间点,一是闹钟时间,二是设置闹钟时的系统时间,当这两个时间点重叠时,铃声音乐将被播放,即闹钟
2、响了u闹钟设定后,需要不断地计算两个时间点间的差值,同时还要求能够使用闹钟的其它功能,如上传铃声文件等u多线程技术,可实现以上多个事务处理的互不影响,各自独立执行的效果9.1实战任务十一:实现闹钟启动的计时功能n 进程和线程u程序是指具有完整功能的一段静态代码u进程是指多任务操作系统中,每个程序的一次动态执行。其对应着代码加载、执行和直至执行完毕的一个完整过程u处理器会为每次加载的进程分配一个独立的内存空间,若同一段代码被加载多次,则会被分配到不同的内存空间加以执行u线程是CPU的最小执行单位,是进程内部的执行线索,但它与进程同样也有产生、发展和消亡三个阶段9.1实战任务十一:实现闹钟启动的计
3、时功能u进程和线程的关系9.1实战任务十一:实现闹钟启动的计时功能u多线程示例运行结果9.1实战任务十一:实现闹钟启动的计时功能u上述程序执行的过程如下,可了解线程的整个生命周期(1)执行main方法,创建一个aloneThread类对象;(2)调用aloneThread类中aloneThread构造方法;(3)创建线程myThread对象,调用start方法,启动该线程;(4)执行线程体run方法;(5)执行FOR循环;(6)在屏幕上打印出数字0-5,每打印出一个数字,调用sleep方法,让线程进入休眠状态(暂停)1000毫秒;(7)在循环过程中,若中断程序,则显示出错误信息;(8)循环执行
4、完成,程序结束。9.1实战任务十一:实现闹钟启动的计时功能n 线程五个状态9.1实战任务十一:实现闹钟启动的计时功能n 创建线程u方法一是创建Thread类的子类u方法二是利用Runnable接口u方法三是利用Callable接口9.1实战任务十一:实现闹钟启动的计时功能n Thread类u通过创建该类的子类,来创建线程uThread类的常用方法9.1实战任务十一:实现闹钟启动的计时功能n 方法一示例9.1实战任务十一:实现闹钟启动的计时功能n 利用Runnable接口uRunnable接口只有一方法public void run()应用示例如右侧代码9.1实战任务十一:实现闹钟启动的计时功能
5、n 线程并发控制u一个进程中的多个线程要共用当前进程的资源,如内存空间、变量、I/O设备等u如何有序高效地利用资源,是多线程应用的关键问题9.1实战任务十一:实现闹钟启动的计时功能n 相关术语u 并行:多个CPU实例或者多台机器同时执行一段处理逻辑,是真正的同时u 并发:通过CPU调度算法,让用户感觉是同时执行,但实际并非真的同时u 线程安全:指在并发情况下,某段代码经过多线程调用,线程的调用顺序不会影响这段代码的执行结果u 互斥:当多个线程需要访问同一资源时,要求在一个时间段内只能允许一个线程来操作共享资源(临界区)。这里线程之间不需要知道对方的存在,执行顺序是乱序u 同步:线程间需要通过交
6、替执行,访问公共资源,来共同完成一个任务u 线程安全:指要控制多个线程对某个资源的有序访问或修改9.1实战任务十一:实现闹钟启动的计时功能n 互斥性、可见性和顺序性uJava引入了synchronized 关键字,实现了互斥性、可见性和顺序性,以保证多个线程有序访问进程资源9.1实战任务十一:实现闹钟启动的计时功能n 未使用互斥锁的存取款示例9.1实战任务十一:实现闹钟启动的计时功能9.1实战任务十一:实现闹钟启动的计时功能n 从运行结果可知,有时存取款的顺序有误(如第二组结果)9.1实战任务十一:实现闹钟启动的计时功能n 在方法上加了互斥锁的存取款示例9.1实战任务十一:实现闹钟启动的计时功
7、能9.1实战任务十一:实现闹钟启动的计时功能n 从这次运行结果可知,存取款线程是有序进行的9.1实战任务十一:实现闹钟启动的计时功能n 利用synchronized实现互斥性的原理uJava中的每个对象都包含了一把锁,它自动成为对象的一部分(不必为此写任何特殊的代码)u调用该对象的任何synchronized方法时,对象就会被锁定,该对象的其他synchronized方法此时也都不可被调用,除非第一个方法完成了自己的工作,并解除锁定9.1实战任务十一:实现闹钟启动的计时功能n 利用synchronized实现线程同步u使用synchronized修饰方法,该方法称为同步方法synchroniz
8、ed修饰成员方法时,则一个线程要执行该方法,必须取得该方法所在的对象的锁,即某个synchronized成员方法被调用时,其它synchronized成员方法不可被调用;synchronized修饰类方法时,则一个线程要执行该方法,必须获得该方法所在的类的类锁,即某个synchronized类方法被调用时,其它synchronized类方法同时也被锁住synchronized修饰一个代码块,则可使得当不同块所需的锁不冲突时,则不必对整个对象加锁。采用对代码块加锁,可以减小锁的粒度9.1实战任务十一:实现闹钟启动的计时功能代码块同步的形式为vsynchronized(obj)/obj表示对象,为
9、共享资源/code9.1实战任务十一:实现闹钟启动的计时功能n 在代码块上加互斥锁的使用示例9.1实战任务十一:实现闹钟启动的计时功能n 从运行结果可知,两个线程的执行是有序的9.1实战任务十一:实现闹钟启动的计时功能n 异步多线程的同步执行u有时主线程和子线程是异步启动的,但又需要以同步方式执行u实现方法join方法isAlive方法u示例先来看一个程序代码9.1实战任务十一:实现闹钟启动的计时功能u上述代码执行时,无法显示出a+的最后结果,为什么?ujoin方法使用join方法,修改上述代码中黑色字体部分,可以解决问题9.1实战任务十一:实现闹钟启动的计时功能ualive方法alive应用
10、示例运行结果9.1实战任务十一:实现闹钟启动的计时功能9.1实战任务十一:实现闹钟启动的计时功能n 死锁现象u两个或多个线程分别拥有不同的资源,而同时又需要对方释放资源才能继续运行u如果锁使用不当,就会出现死锁现象9.1实战任务十一:实现闹钟启动的计时功能n 死锁的产生需同时满足四个条件(以过独木桥为例)u互斥条件:一个资源每次只能被一个进程使用。独木桥每次只能通过一个人。u请求与保持条件:一个进程因请求资源而阻塞时,并对已获得的资源保持不放。乙不退出桥面,甲也不退出桥面。u不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。甲不能强制乙退出桥面,乙也不能强制甲退出桥面。u循环等待条件
展开阅读全文