版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习目标熟悉线程的常用方法,掌握线程的调度和资源共享方法能在程序中实现线程控制主要内容线程控制问题:线程休眠,线程让步与插队,线程同步与死锁【案例10-1】模拟铁路售票系统程序设计线程控制问题线程休眠Thread.sleep():休眠时间的长短有sleep方法的参数决定,millsecond是以毫秒为单位的休眠时间。如果线程在休眠时被打断,JVM就抛出InterruptedException异常。因此,必须在try-catch语句块中调用sleep方法。实例:比如模拟一个火车站的售票窗口,有两个线程售票员ticketSeller和乘客passenger,因为没人买票,售票员决定休息30分钟,这是有个乘客过来,表示买票,吵醒休眠的售票员。线程控制问题线程让步与插队1.线程的让步线程的让步就是让正在执行的任务暂停,使其他任务继续执行。线程让步,其方法如下:实例:比如在校园中,我们经常会看到两队同学互相抢篮球,当某个同学抢到篮球后就可以拍一会,之后他会把篮球让出来,大家重新开始抢篮球,本实例一共模拟红蓝两队,每队分别抢到5次球的情况。这个过程就相当于Java程序中的线程让步。在多线程程序中,可以通过线程的yield()方法将线程转换成就绪状态,让系统的调度器重新调度一次,达到线程让步的目的。
线程控制问题2.线程插队一个线程A在占有CPU资源期间,可以让其他线程调用join()方法插入本线程。实例:比如在火车站买票的时候,有的乘客着急赶火车,会插到队伍前面先买车票,其他乘客再买票。那么在多线程程序中,也可以通过线程插队,让插队的线程先执行完,然后本线程才开始执行。如果线程A在占有CPU资源期间一旦插入B线程,那么A线程将立刻中断执行,一直等到线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行。线程控制问题线程同步与死锁1线程同步通常,一些同时运行的线程需要共享数据。在这种时候,每个线程就必须要考虑其他与他一起共享数据的线程的状态与行为,否则的话就不能保证共享数据的一致性,从而也就不能保证程序的正确性。classStack{intindex=0;char[]data=newchar[6];publicvoidpush(charc){data[index]=c;index++;}publiccharpop(){index--;returndata[index];}}线程控制问题当有两个线程A和B同时使用了Stack类的一个实例时,在某一时刻,A要往堆栈里push数据,而B则要从堆栈中pop数据:(1)操作之前,堆栈中有两个字符:data=|a|c|||||index=2(2)A执行push中的第一条语句data[index]=‘r’:data=|a|c|r||||index=2(3)A还没有执行index++语句,A被B中断,B执行pop()方法,返回‘c’:data=|a|c|r||||index=1(4)A继续执行index++语句:data=|a|c|r||||index=2
最后的结果是r并没有添加到堆栈中去。线程控制问题产生这种问题的原因是对共享资源访问的不完整。为了解决这种问题,需要寻找一种机制来保证对共享数据操作的完整性,这种完整性称为共享数据操作的同步,共享数据叫做条件变量。在Java语言中,引入了“对象互斥锁”的概念(又称为监视器、管程)来实现不同线程对共享数据操作的同步。“对象互斥锁”阻止多个线程同时访问同一个条件变量。在Java语言中,有两种方法可以实现“对象互斥锁”:用关键字volatile来声明一个共享数据(变量);用关键字synchronized来声明一个操作共享数据的方法或一段代码线程控制问题实例:同步问题。假设我们去买火车票,一趟列车的车票数量是固定的,不管有多少个地方可以买火车票,买的一定是这些固定数量的火车票。如果把各个售票点理解为线程的话,则所有线程应该共同拥有同一份票数。从上面的操作代码可以发现,对于票数的操作步骤如下:判断票数是否大于0,大于0则表示还可以买票。如果票数大于0,则卖票出去,票数要减1。但是在第1步和第2部之间有延迟操作,那么1线程就有可能在还没有对票数进行减1操作,其他线程就已经将票数读出来,并且将票数减1了,这样在回到1线程,票数继续减1操作,导致多减了1,使得票数出现负数的情况。上述结果发现:卖出的票数成负数。线程控制问题要想解决资源共享的同步操作问题,可以使用同步代码块及同步方法两种方式完成。(1)同步代码块解决方案线程控制问题(2)同步方法解决方案线程控制问题2线程死锁资源共享时候需要进行同步操作,程序中过多的同步会产生死锁。比如,张三想要李四的画,李四想要张三的书,张三对李四说:“先把你的画给我,我就给你书。”李四也对张三说:“先把你的书给我,我就给你画。”此时,张三等李四答复,而李四也等张三答复,那么这样下去最终结果就是张三得不到李四的画,李四也得不到张三的书,这实际上就是死锁。案例10-1模拟铁路售票系统程序设计【案例描述】模拟一个火车售票系统,假设仅仅剩有2张火车票,三个窗口(也就是三个线程)同时进行售票。如果票数小于0则停止售票,如果有窗口退票,则票数加1,可以继续售票。运行效果如图所示:案例10-1模拟铁路售票系统程序设计【设计目标】能够独立完成“火车售票”程序的源代码编写、编译及运行;理解线程的同步并使用正确的同步控制方法编程;理解并掌握线程的创建。案例10-1模拟铁路售票系统程序设计【实现思路】通过案例描述可知,此程序中包含定义线程的类和测试类。
(1)先定义线程类TicketWindow,三个窗口共享一个火车票资源,因此采用线程同步机制。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 调饮师操作水平模拟考核试卷含答案
- 远离欺凌行为友善促进和谐小学主题班会课件
- 幼儿园教师幼儿行为教育与沟通指导书
- 气动元件制造工岗前复试考核试卷含答案
- 人工智能在制造业的应用发展趋势报告
- 合成油脂装置操作工操作知识评优考核试卷含答案
- 电光源外部件制造工诚信强化考核试卷含答案
- 高温合金抗氧化技术探索课题申报书
- 井筒维修工岗前情绪管理考核试卷含答案
- 汽车发动机再制造装调工岗前安全规程考核试卷含答案
- 2026河北衡水市卫生健康委员会选聘7人考试备考题库及答案解析
- 2025年漳州市云霄城市投资集团面试真题及答案解析
- 2026山东大运河新型建材有限公司招聘工作人员1人笔试参考题库及答案解析
- 成都中医药大学附属医院德阳医院紧急招聘48名临床护理人员笔试参考题库及答案解析
- 2026山东大运河新型建材有限公司招聘工作人员1人笔试模拟试题及答案解析
- 湖南师大附中2026届高三5月月考试卷(九)地理试卷(含答案及解析)
- 2026年绵阳考核招聘笔基础试题库完整参考答案详解
- 2026年成都市成华区网格员招聘考试参考试题及答案解析
- 2026年四川省成都市八年级地理生物会考考试真题及答案
- 2026中国硅烷偶联剂行业现状动态与需求趋势预测报告
- 海南省2025年普通高中学业水平合格性考试化学试卷(含答案)
评论
0/150
提交评论