Java程序设计(第3版)课件 单元5-任务4 学生成绩读写程序设计_第1页
Java程序设计(第3版)课件 单元5-任务4 学生成绩读写程序设计_第2页
Java程序设计(第3版)课件 单元5-任务4 学生成绩读写程序设计_第3页
Java程序设计(第3版)课件 单元5-任务4 学生成绩读写程序设计_第4页
Java程序设计(第3版)课件 单元5-任务4 学生成绩读写程序设计_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务四:学生成绩读写程序设计单元五:Java语言高级程序设计教学目标知识目标掌握多线程互斥关系的产生原因;掌握Synchronized关键字的意义。能力目标能会使用同步技术解决互斥的实现方法。教学内容4任务陈述123知识准备任务实施任务拓展任务实训5任务描述:

学生成绩读写模拟。程序中有两个线程,一个负责写学生成绩数据,一个负责读取和显示学生成绩数据。为了清楚,一个学生有20门课的成绩,写线程写入的每门课的成绩都和其学号相同。如果读线程发现成绩和学号不一致的情况,则说明出现了共享数据读写不一致的问题,利用线程同步机制解决共享数据读写不一致的问题。1.任务陈述

4.1多线程的共享互斥

由于线程是共享进程资源,因此会出现多线程在同时操作同一资源,其中一个线程对资源的操作可能会改变资源状态,而该状态的改变又会影响另一个线程对该对象的操作结果。

例如,在不同的窗口购买火车票,现在只剩一张火车票的情况下,两个窗口同时进行了卖火车票操作,都会激发一个线程完成卖火车票操作,结果有可能是一个座位卖出了2张相同的票。需要被同一进程的不同线程访问的数据称为线程共享数据。像这种在某一时刻只有一个线程可以操作某个资源的机制就叫做共享互斥。2.知识准备

4.1多线程的共享互斥【例5-15】模拟父母在一个盘子中放入苹果,孩子在盘子中拿出苹果,演示多线程的互斥关系。程序运行结果如下:父母向盘子里放:第1个苹果孩子从盘子里拿:第1个苹果孩子从盘子里拿:第1个苹果父母向盘子里放:第2个苹果孩子从盘子里拿:第2个苹果父母向盘子里放:第3个苹果孩子从盘子里拿:第4个苹果……2.知识准备在不同的计算机上运行该程序,结果有可能不同。但通过运行结果可以看出,父母刚刚放入第三个苹果,孩子则已经去拿第四了,这显然是不合理的。因此上面两个线程就存在了互斥关系,任何一个线程对数据的操作都影响程序的结果。4.2使用线程同步解决共享互斥对于互斥现象的出现,Java中提供了同步的控制机制来达到当多个线程需要共享资源时,能够确定资源在某一时刻只能被一个线程占用。Java使用synchronized关键字来标记对象(方法,变量和块)的“互斥锁”,从而保证在任何时刻只能有一个线程访问该对象。同时,Java还提供了wait()、notify()和notifyAll()控制方法:publicfinalvoidwait():使用当前线程主动释放互斥锁,并进入该互斥锁的等待队列。publicfinalvoidnotify():唤醒wait队列中的第一个线程,并将该线程移入互斥锁申请队列中。publicfinalvoidnotifyAll():唤醒wait队列中的所有线程,并将线程移入互斥锁申请队列。2.知识准备【例5-15】使用同步技术改进上面的例子,解决拿苹果和放苹果过程中存在的互斥关系。publicsynchronizedintgetApple(){//对方法进行同步设置 while(this.available==false){ try{

wait();//进入等待队列 }catch(Exceptionex){ ex.printStackTrace();

} } this.available=false;

notifyAll();//通知队列中所有等待的对象 returnapple;

}2.知识准备publicsynchronizedvoidputApple(intapple){//方法同步实际上还是对资源共享的设置,这里的资源就是apple while(this.available==true){ try{

wait(); }catch(Exceptionex){ ex.printStackTrace(); } } this.apple=apple; this.available=true;

notifyAll();//最后唤醒所有等待的对象 }}2.知识准备实施思路同步块和同步方法都可以解决共享数据保护的问题。如果代码都是自己写的,尽可能使用同步方法。如果调用别人写好的、自己无法修改的非同步方法,就只能将调用语句放在同步块中了。定义StudentScore类,通过增加两个同步方法readScore和writeScore实现数据封装;定义WriteScore和ReadScore线程类代码,通过调用同步方法readScore和writeScore实现数据读写;运行程序测试解决互斥的有效性。3.任务实施程序代码

publicsynchronized

voidwriteScore(intcounter){//获得score的监视器no=counter;for(inti=0;i<score.length;i++){try{Thread.sleep(20);}catch(Exceptione){System.out.println("Writescore"+e);}score[i]=counter;}}3.任务实施publicsynchronizedvoidreadScore(){//获得score的监视器inti=0;for(i=0;i<score.length;i++){if(score[i]!=no){System.out.print("no="+no+";");System.out.print("score["+i+"]="+score[i]+";");System.out.println("");break;}}if(i==score.length){System.out.println("allscoreequalsno="+no);}}}3.任务实施死锁问题

当多个线程竞争共享资源时,可以通过同步来保证资源的独占,但没有考虑一个线程已经占有某些资源后又要申请其他资源的情况。当一个线程需要一个资源二另一个线程持有该资源不释放时,就会发生死锁现象。例如,主线程一直在执行拿起筷子的操作,也就一直占有筷子资源,而Eat线程若想拿起筷子则永远完成不了,会无限等待下去,造成死锁。4.任务拓展

死锁现象是很难通过调试和测试发现,通常情况下它很难发生,只有当多个线程恰好偶然产生死锁。因此Java技术既不能发现死锁也不能避免死锁。预防和打破死锁现象要从死

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论