zoukankan      html  css  js  c++  java
  • 20155328 2016-2017-2 《Java程序设计》第六周 学习总结

    20155328 2016-2017-2 《Java程序设计》第6周学习总结

    教材学习内容总结

    • 根据不同的分类标准,IO可分为:输入/输出流;字节/字符流;节点/处理流。

    • 在不使用InputStream与OutputStream时,必须使用Clos()方法关闭串流。

    • InputStream和OutputStream的常用类继承架构:

    • 可以使用System的setIn()方法指定InputStream实例,重新指定标准输入来源;用setOut()方法指定PrintStream实例,将结果输出至指定的目的地。

    • FileInputStream主要操作InputStream()的read()抽象方法,使之可以从文档中读取数据;FileOutputStream主要操作了OutputStream的write()抽象方法,使之可以写出数据至文档。

    • 如果将JVM看作一台虚拟计算机,只安装一颗叫主线程的CPU即可执行main()定义的执行流程,创建Thread实例即为JVM加装CPU。而启动额外CPU就是调用Thread实例的start()方法

    Thread基本状态图:

    • wait()、notify()与notifyAll()是Object定义的方法,可以通过这三种方法控制线程释放对象的锁定,或者通知线程参与锁定竞争。

    教材学习中的问题和解决过程

    • 问题1:在第十章开始时,对书上的输入和输出流的划分不太理解:

    从应用程序角度来看,如果要将数据从来源取出,可以使用输入串流,如果要将数据写入目的地,可以使用输出串流。

    • 解决方案:看了蓝墨云班课的教学视频《Java当中的IO(一)》,豁然开朗:

    输入/输出都是相对于Java程序本身而言,相对于应用程序将来源取出,即相对于Java程序将数据输入,使用的是输入串流;而将数据写入目的地,相对于Java程序是输出,所以使用输出串流。

    • 问题2:可通过wait()、notify()与notifyAll()三个方法来控制线程释放对象的锁定或通知线程参与锁定竞争,那么三个方法有什么区别?

    • 解决方案:通过课本学习及网上资料查询,有了如下结论:

    wait

    Object的wait方法有三个重载方法,其中一个方法wait() 是无限期(一直)等待,直到其它线程调用notify或notifyAll方法唤醒当前的线程;另外两个方法wait(long timeout) 和wait(long timeout, int nanos)允许传入 当前线程在被唤醒之前需要等待的时间,timeout为毫秒数,nanos为纳秒数。

    notify

    notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作系统对多线程管理的实现。

    notifyAll

    notifyAll 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现。

    这些方法可以使用于“生产者-消费者”问题,消费者是在队列中等待对象的线程,生产者是在队列中释放对象并通知其他线程的线程。

    让我们来看一个多线程作用于同一个对象的例子,我们使用wait, notify and notifyAll方法。

    代码调试中的问题和解决过程

    • 问题1:synchronized如何以描述句式方式使用?

    • 解决方案:

    public void add(Object o){
        synchronized(this){
                if(next==elems.length){
                    elems=Arrays.copyOf(elems,elems.length*2);
                    }
                    elems[next++]=o;
                }
        }
    

    这个程序片段的意思是在线程要执行synchronized区块时,必须取得括号中指定的对象锁定。事实上此语法的目的之一,可应用于不想锁定整个方法,而只想锁定会发生竞速状况的区块,在执行完区块后线程即释放锁定,其他线程就有机会再竞争对象锁定。

    代码托管

    运行statistics脚本截图:

    上周考试错题总结

    • 错题1:
      (单选题|1分)
      创建一个只能存放String的泛型ArrayList的语句是哪项?

    A .
    ArrayList al=new ArrayList();

    B .
    ArrayList al=new ArrayList()

    C .
    ArrayList al=new ArrayList();

    D .
    ArrayList al =new List();

    答案:B 错题原因:对ArrayList语法了解不够深彻。

    • 错题2:
      (多选题|1分)
      Which of the following methods will not compile?
      A .
      private void method1(String name) {
      if (name.equals("star"))
      throw new IllegalArgumentException(name);
      }

    B .
    private void method2(int age) {
    if (age > 30)
    throw Exception();
    }

    C .
    public double method5() throws Exception {
    return 0.7;
    }

    D .
    protected double method4() throws Exception {
    throw new Throwable();
    }

    答案:BD 错题原因:错选了A选项,忽略了 IllegalArgumentException是一个RuntimeException,可以不用在声明方法时用throws就抛出。

    • 错题3:
      (单选题|1分)
      现有:
      `(单选题|1分)
      现有:
      1. class Propeller2 {
      2. pulolic static void main (String[]args)//add code here?
      3. { new Propeller2().topGo(); }
      4.
      5.void topGo() //add code here?
      6. { middleGo(); }
      7.
      8.void middleGo() //add code here?
      9. { go(); System.out.println ("late middle"); }
      10.
      11. void go() //add code here?
      12. {throw new Exception(); }
      13. }

    为使代码通过编译,需要在哪一行加入声明throws Exception?

    A .
    只在第11行

    B .
    在第8行和第11行

    C .
    在第5行、第8行和第11行

    D .
    在第2行、第5行、第8行和第11行`

    答案:D 错题原因:对throws Exception的用法了解得不够全面。

    • 错题4:(多选题|1分)
      关于try...catch...finally结构,描述正确的是哪些?

    A .
    可以有多个catch

    B .
    只能有一个catch

    C .
    可以没有catch

    D .
    finally必须有

    正确答案: AC 错题原因:误选了D选项,finally并不必须有。

    结对及互评

    点评过的同学博客和代码

    • 本周结对学习情况
    • 结对对象:20155325

    其他(感悟、思考等,可选)

    一些感悟

    这周因为清明假期调休的原因,周六不是完整的一天来自习,因此学习时间稍有下降,第十一章也并没有在本周全部学完。这周上课时娄老师所说周一周二周三的计划,思之觉得或有益于自己,决定在下周学完第十一章后进行尝试,不要将任务堆积。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 8/8 1/1 20/20
    第二周 164/172 1/2 25/45
    第三周 248/420 1/3 25/70
    第四周 465/885 1/4 25/95
    第五周 390/1275 1/5 15/110
    第六周 626/1901 1/6 24/134

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:27小时

    • 实际学习时间:24小时

    • 改进情况:一边学习一边记录遇到的问题,比上周学的轻松一些。

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    Java多线程 ReadWriteLock、StampedLock用法
    Java多线程基础
    Java中创建多线程
    Java中多线程同步
    Java多线程 synchronized与ReentrantLock用法
    Linux6配置bond链路聚合
    Bash Shell命令流程
    location uri 添加 / 和不添加 / 的区别?
    Nginx负载均衡健康检查nginx_upstream_check_module
    Zabbix4.0源码安装基于LNMP
  • 原文地址:https://www.cnblogs.com/zyqzyq/p/6658961.html
Copyright © 2011-2022 走看看