




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
§6-2餐馆点餐场景模拟Java语言程序设计教学目标任务分析
某个餐馆,有一个厨师和一个服务员,服务员必须等待厨师准备好食物才能上菜。当厨师准备好食物时,他通知服务员,后者将得到食物,然后回去继续等待。多个线程在处理同一个资源,并且任务不同时,为了避免对同一共享资源的争夺,需要使用线程间通信机制。目录1线程通信机制为什么要线程通信23死锁一、为什么要线程通信
多个线程并发执行时,在默认情况下CPU是随机切换线程的,当需要多个线程来共同完成一件任务,并且希望它们有规律的执行,那么多线程之间需要一些协调通信,以此来达到多线程共同操作一份数据。多线程之间的通信能够避免对同一共享变量的争夺。二、线程通信机制
线程通信机制通过线程之间的“握手机制”来进行的,这种握手可以通过Object的方法wait()和notify()来安全的实现,也可以通过条件对象来实现。
在一个线程进行了规定操作后,就进入等待状态(wait),等待其他线程执行完他们的指定代码过后再将其唤醒(notify)。典型应用:生产者/消费者模式wait(longmills):接受毫秒数作参数,含义与sleep()方法里参数的意思相同,都是指“在此期间停止”。不同之处在于,对于wait(longmills)而言:1)在wait()调用期间对象锁是释放的。2)可以通过notify()、notifyAll(),或者时间到期,从wait()中恢复执行。无参wait():wait()将无限等待下去,直到线程接收到notify()或notifyAll()消息。一般情况下,在等待某个条件时(这个条件必须由当前方法以外的因素才能改变,一般由另一个线程所改变),就应该使用wait()。因为如果在线程里测试条件的时候空等会极大的占用CPU时间,而wait()允许在等待外部条件的时候让线程休眠,只有在收到notify()或notifyAll()的时候线程才唤醒,并对变化进行检查。二、线程通信机制注意:wait()、notify()以及notifyAll()是Object类的方法,wait()可以放进任何同步控制方法里,也必须放在同步方法或代码块里。sleep()是Thread类的方法,可以在非同步控制方法里调用二、线程通信机制二、线程通信机制
条件对象(Condition)是在JavaSE5.0中引入的。条件对象与锁对象一起使用,一个锁对象可以有一个或多个相关的条件对象,通过锁对象的newCondition()方法可以获得一个条件对象。Condition接口为它的子类提供了await()、signal()和signalAll()三个方法,它们的使用方法与wait()、notify()和notifyAll()方法类似。因为线程会被阻塞,且对象可以具有同步控制方法用以防止别的线程在锁还没有释放的时候就访问这个对象,所以就可能会出现这样的情况:某个线程在等待另一个线程,而后者又等待别的线程,这样一直下去,直到这个链条上的线程又在等待第一个线程释放锁。这得到了一个线程之间相互等待的连续循环,没有哪一个线程能继续,这被称之为“死锁”。三、死锁线程2本子线程1书包把“本子”给我,我才能释放“书包”把“钢笔”给我,我才能释放“本子”线程3钢笔拿到“书包”,我才能释放“钢笔”当下面四个条件同时满足时,就会发生死锁。1)互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用。2)不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占用者主动释放。3)请求和保持,即当资源的请求者在请求其他的资源的同时保持对原有资源的占有。4)循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。因为要发生死锁的话,所有这些条件必须全部满足。所以要防止死锁的话,只需要破坏其中一个即可。Java对死锁并没有提供语言层面上的支持,我们只能通过仔细的设计程序来避免死锁。三、死锁任务实施餐馆点餐模拟程序实现步骤:定义食物类Food,可设定该餐馆最多可接6份食物,定义服务员类WaitPerson定义厨师类Chef定义餐厅类Restaurant已知一蛋糕店有一名销售员和一名蛋糕师
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论