zoukankan      html  css  js  c++  java
  • 11

    作业11-多线程


    1. 本周学习总结

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


    2. 书面作业

    本次PTA作业题集多线程

    1. 源代码阅读:多线程程序BounceThread

    1.1 BallRunnable类有什么用?为什么代码中需要调用Thread.sleep进行休眠?

    • 感觉上是调用move比较大小完之后,重构了图形,当前线程暂停,最后五个中找到最大的显示。
    • 需要当前线程暂停,然而先去执行其他的线程,再回来执行这个线程。

    1.2 Ball.java只做了两件事,这两件事分别是什么?BallComponent对象是干什么的?其内部的ArrayList有什么用?程序运行过程中,生成了几个BallComponent对象?该程序使用了多线程技术,每个小球是分别在不同的线程中进行绘制吗?

    • 通过move修改图形的界面,构建Ellipse2D图形。
    • 创建JComponent类型的图形。
    • 放入多个Ball进入集合中储存
    • 一个
    • 是的

    1.3 选做:程序改写:程序运行时,每个小球都是从固定位置出发。如何改写该程序,使得当点击start时,每个小球可以从不同位置出发、以不同的步进移动?

    1.4 选做:不同小球的移动轨迹一模一样。改造程序,使得每个小球运行轨迹不完全一样,比如有的可以走余弦轨迹、有的可以走方波轨迹、有的走布朗运动、有的走五角星,等等。

    2. 实验总结:题集(多线程)

    2.1 题目:Thread、PrintTask、Runnable与匿名内部类。

    并回答:a)通过定义Runnable接口的实现类来实现多线程程序比通过继承自Thread类实现多线程程序有何好处?b) 6-1,6-3,6-11实验总结。

    • Java中实现多线程有两种方法:继承Thread类和实现Runnable接口,因为实现接口比继承类要好,一个Thread对象不能调用两次start(),所以每次都要创建一个新的对象来执行start()方法,然后会导致线程冲突。用Runnable接口就能很好的解决这个问题,通过一个线程启动三次,就可以让三个线程同时进行。
    • 6-1是通过继承自Thread类实现,6-11是通过定义Runnable接口的实现类,程序上感觉没什么区别,可能也是因为只有一个线程的原因,导致优缺点不明显。6-3匿名类的话还是觉得实在是很方便快捷,也不用想名字。

    2.2 使用Lambda表达式改写6-3

    final String mainThreadName = Thread.currentThread().getName();
    		new Thread(()->{
    			System.out.println(mainThreadName);
            	System.out.println(Thread.currentThread().getName());
            	System.out.println(Arrays.toString(getClass().getInterfaces()));
    		}).start();
    

    2.3 题目:6-2(Runnable与停止线程)。回答:需要怎样才能正确地停止一个运行中的线程?

    不能用stop()简单粗暴的停止,很容易出错,可以用一个标识符,记录什么时候该停止,在run里面用循环,但是一直要识别标识符是否改变。

    2.4 选做:6-8(CountDownLatch)实验总结

    2.5 选做:6-9(集合同步问题)实验总结

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

    3. 互斥访问

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

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

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

    4. 互斥访问与同步访问

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

    4.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法可以使用synchronized实现互斥同步访问,使用代码说明(请出现相关代码及学号)?

    把修饰方法上的synchronized去掉,在方法内部写同步块就好

    synchronized (this) {
         代码
    }
    

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

    同步方法:

    public synchronized void insert(Thread thread){
    关键代码
    }
    

    同步代码块:

    synchronized (this) {
        关键代码
    }
    

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

    • 通过锁才能运行。
    • 当一个线程正在访问一个对象的synchronized方法,那么其他线程不能访问该对象的其他synchronized方法。这个原因很简单,因为一个对象只有一把锁,当一个线程获取了该对象的锁之后,其他线程无法获取该对象的锁,所以无法访问该对象的其他synchronized方法
    • 没有锁的对象进入Lock pool等待线程结束,有锁就执行。

    4.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?

    wait(),notify(),await()等方法。

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

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

    不正常,因为加入放入的顺序反了会导致出错。

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

    5.3 选做:使用Lock与Condition对象解决该问题。

    6. 面向对象设计作业-图书馆管理系统(班级周六出游,作业有点赶,做不完,周天再来写大作业)

    6.1 系统的功能模块表格,表格中体现出每个模块的负责人。

    6.2 运行视频

    6.3 讲解自己负责的模块,并粘贴自己负责模块的关键代码(出现学号及姓名)。


    7. 选做:使用其他方法解决题目5的生产者消费者问题。

    7.1 使用BlockingQueue解决生产者消费者问题关键代码截图

    7.2 说明为什么不需要显示的使用wait、notify就可以解决同步问题。这样解决相比较wait、notify有什么优点吗?

    7.3 使用Condition解决生产者、消费者问题。

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

    9. 选做:单元测试JUint4

    实验任务书中的题目6:单元测试使用JUnit4。
    使用JUnit4对两个排序算法的排序时间进行比较,并截图。


    3.码云及PTA

    题目集:多线程

    3.1. 码云代码提交记录

    在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
    必须出现几个要素:提交日期-用户名(姓名与学号)-不提交说明

    3.2 截图"多线程"PTA提交列表

    需要有两张图(1. 排名图。2.PTA提交列表图)


    3.3 统计本周完成的代码量

    需要将每周的代码统计情况融合到一张表中。
    上次统计时间:2017-11-25 10:38:28
    距离上次统计经过了:168小时14分钟41秒

    周次 总代码量 新增代码量 总文件数 新增文件数
    1 0 0 0 0
    2 0 0 0 0
    3 0 0 0 0
    4 0 0 0 0
    5 0 0 0 0
    6 1553 1553 24 24
    7 1848 295 30 6
    8 2902 1054 41 11
    9 3299 397 48 7
    10 3719 420 52 4
    11 4053 334 59 7
    12 4340 287 66 7

    4. 选做:课外阅读

    4.1 Java Concurrent Animated

    4.2 线程的高级知识笔记

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

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

    4.5 线程池,这一篇或许就够了

    4.6 Java 8 Concurrency Tutorial: Threads and Executors


    5. 选做:学会使用Eclipse进行调试

    观看相关调试视频

    5.1 简述使用Eclipse进行调试需要几步?调试时F5, F6, F7快键键各有什么不同?什么情况该使用哪个快捷键?

    • 找好断点,进入Debug模式
    • F5是进入到函数或语句块的内部,F6是单步运行,一行一行的走,F7可以跳当前监听函数或语句块  F8 会直接跳到下个断点
    • 一般是使用F8,类似于c语言,进入到内部那些就很花时间,而且也不是很看得懂。

    5.2 实验任务书中的题目5:使用Eclipse进行调试中的5.1,如何使用Eclipse的调试功能发现当读取“蓝山兰”这行不会出错的原因?

    5.3 任务书5.2,截图证明你会使用条件断点。

    5.4 选做:调试MessageBoard.zip中的系统直至可以正常运行。说明你是怎么找到该系统中的错误?使用到了什么调试技巧?

    参考资料:Eclipse 的一些调试技巧

  • 相关阅读:
    Docker容器启动时初始化Mysql数据库
    使用Buildpacks高效构建Docker镜像
    Mybatis 强大的结果集映射器resultMap
    Java 集合排序策略接口 Comparator
    Spring MVC 函数式编程进阶
    换一种方式编写 Spring MVC 接口
    【asp.net core 系列】6 实战之 一个项目的完整结构
    【asp.net core 系列】5 布局页和静态资源
    【asp.net core 系列】4. 更高更强的路由
    【Java Spring Cloud 实战之路】- 使用Nacos和网关中心的创建
  • 原文地址:https://www.cnblogs.com/nzlj/p/7953628.html
Copyright © 2011-2022 走看看