本周学习总结

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. Spring(二)

    1.1 AOP概述 1.1.1什么是AOP AOP(Aspect Oriented Programing) 面向切面编程. AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.事务管理 ...

  2. C++ 开发OCX 的方法和注意事项

    C++ 开发OCX 的方法和注意事项 前言 ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个控件的COM组件.ActiveX控件这种技术涉及到了几乎所有的COM和OLE的技术精 ...

  3. Java并发工具类 - CountDownLatch

    Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...

  4. 项目管理利器---Maven

    Maven快速入门 maven介绍 maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建.报告和软件的项目管理工具.简单来说,maven可以帮助我们更有效的管理项目,也是一套 ...

  5. “selection does not contain a main type”解决方法

    在运行java程序时,出现了错误“selection does not contain a main type”. 是因为.java文件不在项目的src路径内,也就是说源代码未被eclipse编译,字 ...

  6. HIVE—索引、分区和分桶的区别

    一.索引 简介 Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapRed ...

  7. 初始MyBatis、SQL映射文件

    MyBatis入门 1.MyBatis前身是iBatis,是Apache的一个开源项目,2010年这个项目迁移到了Google Code,改名为MyBatis,2013年迁移到GitHub.是一个基于 ...

  8. 数据库及SQL----常用知识点总结

    数据库也是计算机类笔试面试中不可避免会遇到的考点,尤其是银行和部分传统软件类公司.这里根据整理的资料,对数据库的相关知识也做个总结吧.希望学过数据库但长时间不用的同学根据这些知识能够回忆和重拾,没学过 ...

  9. 第一章 [分布式CMS]

    第一次准备写一个完整的例子, 也是正在做的一个项目! 准备记录一下"心路历程".... 项目为分布式的CMS 前期架构分为,单点登录,结构系统,资源云,文档云 ,DB服务,工具服务 ...

  10. jre1.8使用ikvm.net8将jar转换为dll以供c#调用

    由于合作方使用.net编程,jar包不能用,需要转换成dll格式,来回转换了十几个dll文件,终于生成了一个可用的.在这里将走过的弯弯绕绕总结下,希望遇到相似问题的同好们,能走得顺利些. 版本问题: ...