Java程序设计_徐红 王灿_电子课件23_单元5_任务4.ppt

Java程序设计_徐红 王灿_电子课件23_单元5_任务4.ppt

ID:51963901

大小:487.00 KB

页数:14页

时间:2020-03-26

Java程序设计_徐红 王灿_电子课件23_单元5_任务4.ppt_第1页
Java程序设计_徐红 王灿_电子课件23_单元5_任务4.ppt_第2页
Java程序设计_徐红 王灿_电子课件23_单元5_任务4.ppt_第3页
Java程序设计_徐红 王灿_电子课件23_单元5_任务4.ppt_第4页
Java程序设计_徐红 王灿_电子课件23_单元5_任务4.ppt_第5页
资源描述:

《Java程序设计_徐红 王灿_电子课件23_单元5_任务4.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、任务四:学生成绩读写程序设计单元五:Java语言高级程序设计教学目标知识目标掌握多线程互斥关系的产生原因;掌握Synchronized关键字的意义。能力目标能会使用同步技术解决互斥的实现方法。教学内容4任务陈述123知识准备任务实施任务拓展任务实训5任务描述:学生成绩读写模拟。程序中有两个线程,一个负责写学生成绩数据,一个负责读取和显示学生成绩数据。为了清楚,一个学生有20门课的成绩,写线程写入的每门课的成绩都和其学号相同。如果读线程发现成绩和学号不一致的情况,则说明出现了共享数据读写不一致的问题,利用线程同步机制解决共

2、享数据读写不一致的问题。1.任务陈述4.1多线程的共享互斥由于线程是共享进程资源,因此会出现多线程在同时操作同一资源,其中一个线程对资源的操作可能会改变资源状态,而该状态的改变又会影响另一个线程对该对象的操作结果。例如,在不同的窗口购买火车票,现在只剩一张火车票的情况下,两个窗口同时进行了卖火车票操作,都会激发一个线程完成卖火车票操作,结果有可能是一个座位卖出了2张相同的票。需要被同一进程的不同线程访问的数据称为线程共享数据。像这种在某一时刻只有一个线程可以操作某个资源的机制就叫做共享互斥。2.知识准备4.1多线程的共享

3、互斥【例5-15】模拟父母在一个盘子中放入苹果,孩子在盘子中拿出苹果,演示多线程的互斥关系。程序运行结果如下:父母向盘子里放:第1个苹果孩子从盘子里拿:第1个苹果孩子从盘子里拿:第1个苹果父母向盘子里放:第2个苹果孩子从盘子里拿:第2个苹果父母向盘子里放:第3个苹果孩子从盘子里拿:第4个苹果……2.知识准备在不同的计算机上运行该程序,结果有可能不同。但通过运行结果可以看出,父母刚刚放入第三个苹果,孩子则已经去拿第四了,这显然是不合理的。因此上面两个线程就存在了互斥关系,任何一个线程对数据的操作都影响程序的结果。4.2使用

4、线程同步解决共享互斥对于互斥现象的出现,Java中提供了同步的控制机制来达到当多个线程需要共享资源时,能够确定资源在某一时刻只能被一个线程占用。Java使用synchronized关键字来标记对象(方法,变量和块)的“互斥锁”,从而保证在任何时刻只能有一个线程访问该对象。同时,Java还提供了wait()、notify()和notifyAll()控制方法:publicfinalvoidwait():使用当前线程主动释放互斥锁,并进入该互斥锁的等待队列。publicfinalvoidnotify():唤醒wait队列中的第

5、一个线程,并将该线程移入互斥锁申请队列中。publicfinalvoidnotifyAll():唤醒wait队列中的所有线程,并将线程移入互斥锁申请队列。2.知识准备【例5-15】使用同步技术改进上面的例子,解决拿苹果和放苹果过程中存在的互斥关系。publicsynchronizedintgetApple(){//对方法进行同步设置while(this.available==false){try{wait();//进入等待队列}catch(Exceptionex){ex.printStackTrace();}}this.

6、available=false;notifyAll();//通知队列中所有等待的对象returnapple;}2.知识准备publicsynchronizedvoidputApple(intapple){//方法同步实际上还是对资源共享的设置,这里的资源就是applewhile(this.available==true){try{wait();}catch(Exceptionex){ex.printStackTrace();}}this.apple=apple;this.available=true;notifyAll(

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

8、onizedvoidwriteScore(intcounter){//获得score的监视器no=counter;for(inti=0;i

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。