本周学习总结

1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。


书面作业

本次PTA作业题集多线程

互斥访问与同步访问

完成题集4-4(互斥访问)与4-5(同步访问)

1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?

也可以使用synchronized代码块,将属性balance上锁,生成对象锁,实现互斥同步访问。

1.2 同步代码块与同步方法有何区别?

answer:同步代码块只是对某些对象上锁,未获得对象锁就无法访问。而同步方法是对某个方法上锁,需要等待同步方法执行完毕返回结果。

1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?

answer:对同一资源进行存取时会出现互斥的现象。所以要对线程进行调度,对方法或对象上锁,调用时需要获得对象锁,如果没有对象锁就要等待同步锁被释放才能获取对象锁。当程序执行synchronized同步代码块或者同步方法时,线程先是获取CPU处于Running状态,获取对象的同步锁时,若该同步锁被别的线程占用就会进入Lock Pool中等同步锁释放再次进入Runnable。如果在进入块中执行了wait(),就会进入Wait Pool等待被notify/notifyAll唤醒,进入Lock Pool中。

1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?

answer:Java多线程中使用了wait () 和notify()/notifyAll()等关键字实现线程之间的通信。wait()可以使线程进入等待状态,再被其他线程notify()/notifyAll()唤醒,进而实现线程的协同工作。有了synchronized上锁后,其他线程才会等待同步锁释放并竞争获取锁,执行wait()会使线程放弃对象锁并堵塞,等到其他线程notify()唤醒时再重新进入等待同步锁释放并竞争同步锁的状态。

交替执行

4-6 实验总结(不管有没有做出来)

answer:Repo中存储不同的任务使用的是ArrayList,任务执行完直接用list.remove(0)移除此任务。两个线程交替执行时是对Worker1上锁,然后用wait()与notify中对线程进行调度。最开始是使用Synchronized对两个run方法上同步锁,再进行调度,出现了线程比较混乱的状况,每次的执行结果都不同。最后当list为空的时候,要终止线程。

互斥访问

3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)

3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)



运行结果:

参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask

线程间的合作:生产者消费者问题

4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?

answer:结果不正常。会出现“仓库已满!无法添加货物。”,“仓库无货!无法从仓库取货”的错误提示。因为出项了互斥访问,无法同步对同一数据进行存取,线程混乱,结果就出现了这些问题。

4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)

4.3 选做:使用LockCondition对象解决该问题。

查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)

answer:在多线程的情况下,可能会发生互斥,无法同步的问题。此时线程就会出现异常,或执行顺序混乱。比如消费者与生产者同时存取同一数据时就会产生互斥访问。线程安全是采用锁的形式对线程的执行顺序进行调度。可以使用synchronized, wait, notify或Lock或线程池来有序执行线程。比如可以在消费者与生产者互斥时,对add和remove方法上锁,使用wait, notify来调整获得对象锁的线程。

选做:实验总结

6.1 4-8CountDownLatch)实验总结

answer:此题需要使用的是执行器中的固定线程数线程池,即Executors.newFixedThreadPool(poolSize);poolSize为固定的线程数。CountDownLatch允许线程一直等待,直到其他线程的操作执行完后再执行。任务类要实现Runnable接口。

6.2 4-9(集合同步问题)实验总结

answer:使用Collections.synchronizedList解决集合的同步问题,确保线程安全

6.3 较难:4-10(Callable),并回答为什么有Runnable了还需要Callable?实验总结。

answer:4-10主要根据题目要求写,实现Callable接口的类里面要有call()方法,任务执行时会调用call()方法,并可将返回值提交到Future型的列表中,之后再依次读取。使用Callable可以得到返回值,便对计算结果进行验证。

###7.1 使用`BlockingQueu`e解决生产者消费者问题关键代码截图
###7.2 说明为什么不需要显示的使用wait、notify就可以解决同步问题。这样解决相比较wait、notify有什么优点吗?
##选做:使用其他方法解决题目4的生产者消费者问题。
###7.3 使用`Condition`解决生产者、消费者问题。

选做:编写一段代码,证明你会使用ForkJoinPool


码云上代码提交记录

题目集:多线程(4-4到4-10)

3.1 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2 截图多线程PTA提交列表


选做:课外阅读

4.1 Questions and Exercises: Concurrency,学习总结。

4.2 Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask

4.3 Java 8 Concurrency Tutorial: Threads and Executors

201521123036 《Java程序设计》第11周学习总结的更多相关文章

  1. 201521123045 <java程序设计>第11周学习总结

    201521123045 <java程序设计>第11周学习总结 1. 本周学习总结 2. 书面作业 2. 书面作业 Q1.1.互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问 ...

  2. 201521123027 <java程序设计>第11周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2.书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchro ...

  3. 2018面向对象程序设计(Java)第11周学习指导及要求

    2018面向对象程序设计(Java)第11周学习指导及要求 (2018.11.8-2018.11.11)   学习目标 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: ...

  4. 面向对象程序设计(JAVA) 第11周学习指导及要求

    2019面向对象程序设计(Java)第11周学习指导及要求 (2019.11.8-2018.11.11)   学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接 ...

  5. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  6. 2018-2019 2 20175230《Java程序设计》第九周学习总结

    <Java程序设计>第九周学习总结 主要内容 MySQL数据库管理系统 1.下载 2.安装 启动MySQL数据库服务器 1.启动 2.root用户 MySQL客户端管理工具 建立连接 建立 ...

  7. 20175209 《Java程序设计》第九周学习总结

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

  8. 20175208 《Java程序设计》第九周学习总结

    20175208 2018-2019-2 <Java程序设计>第九周学习总结 一.教材学习内容总结: 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系 ...

  9. 20175202 《Java程序设计》第九周学习总结

    20175202 2018-2019-2 <Java程序设计>第九周学习总结 教材知识点总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称 ...

  10. 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十一章 JDBC数据库操作 MySQL数据库管理系统 下载安装MySQL 若下载的是 ...

随机推荐

  1. Qt控件窗体区域区分

    控件窗体区域区分几何参数: 指的是窗口的大小和位置,一个窗口有两套几何参数,一套是窗口外边框所占的矩形区域,另一套是窗口客户区所占的矩形区域,所谓窗口客户区就是窗口中除去边框和标题栏用来显示内容的区域 ...

  2. C#多线程的用法5-线程间的协作Monitor

    之前我们使用lock快捷方式,实现了多线程对同一资源的共享.在C#中lock实际上是Monitor操作的简化版本. 下面使用Monitor来完成之前的lock功能,你可以在此做一下对照: privat ...

  3. python自动化运维三:数据报表定制以及scapy模块介绍

    p { margin-bottom: 0.25cm; line-height: 120% } a:link { } Excel也是报表的一个重要的工具.这里首先接受下excel的操作.先来看一个简单的 ...

  4. 再起航,我的学习笔记之JavaScript设计模式11(外观模式)

    经过一段时间的学习与分享,我们对创建型设计模式已经有了一定的认识,未来的一段时间里我们将展开新的篇章,开始迈入结构性设计模式的学习. 结构性设计模式与创建型设计模式不同,结构性设计模式更偏向于关注如何 ...

  5. oracle多表连接查询竟然还有这种操作

    仔细观察上面几个图,比较下 oracle数据库中的+操作符竟然可以替换left join 和right join sql server暂时没用到过

  6. Vim 命令图解-Gvim使用笔记

    Vim 命令图解-Gvim使用笔记... 参考的网址:http://blog.vgod.tw/wp-content/uploads/2014/08/vgod-vim-cheat-sheet-full. ...

  7. WeQuant交易策略—Chaikin A/D

    策略名称:AD指标策略 多空双方力量浮标- AD(Chaikin A/D线)策略关键词:ChaikinA/D线.多空对比.AD指标是一种非常流行的平横交易量指标, 用于估定一段时间内该证券累积的资金流 ...

  8. Java常见算法整理

    兔子问题(斐波那契数列规律) 台阶问题 (兔子问题变种,递归规律) 素数问题(判断素数.质数方式) 水仙花数问题(数字分解) 查找算法(二分查找) 排序算法(选择排序,冒泡排序,快速排序) 兔子问题, ...

  9. [2017-08-16]ABP系列——QuickStartB:正确理解Abp解决方案的代码组织方式、分层和命名空间

    本系列目录:Abp介绍和经验分享-目录 介绍ABP的文章,大多会提到ABP框架吸收了很多最佳实践,比如: 1.N层 (复用一下上篇的图) 展现层(Personball.Demo.Web):asp.ne ...

  10. 如何快速的理解JavaScript闭包?

    先看问题 1. 在js中的作用域是什么? 作用域就是作用范围,作用空间.作用域分为全局作用域和局部作用域.(这个东西大家都明白) 如果把局部作用域比作一个国家,那么全局作用域就是地球,地球上除了那个国 ...