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

教材学习内容总结

InputStream与OutputStream

串流设计
  • 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而言的。
  • Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象。
  • InputStream、OutStream提供串流基本操作,如果想要为输入/输出的数据做加工处理,则可以使用打包器类。常用的打包器具备缓冲区作用的BufferedOutputStream、BufferedInputStream,具备数据转换处理的DataInputStream、DataOutputStream,具备对象串行化能力的ObjectInputStream、ObjectOutputStream等。
  • 在进行InputStream与OutStream的相关操作时若发生错误,会抛出java.io.IOException异常,在dump()方法上声明throws,由调用dump()方法的客户端处理。
串流继承架构
  • 标准输入/输出

System.in: 标准输入,默认关联到键盘(终端输入)。

System.out: 标准输出,默认关联到显示器(终端输出)。

System.err: 标准错误,默认关联到显示器(终端输出)。

  • FileInputStream与FileOutPutStream

FileInputStream是InputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可用来读取数据。

FileOutputStream是OutputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来写出数据。

  • ByteArryInputStream与ByteArryOutputStream

ByteArryInputStream是InputStrteam的子类,可以指定byte数组创建实例,一旦创建就可将byte数组当做数据源进行读取。

ByteArryOutputStream是OutputStream的子类,可以指定byte数组创建实例,一旦创建将byte数组当做目的地写出数据。

串流处理装饰器
  • BufferedOutputStream与BufferedInputStream:内部提供缓冲,提高效率。
  • DataInputStream与DataOutputStream:具备数据转换处理功能,自动在指定的类型与字节间转换。

字符处理类

Reader与Writer继承架构
  • 针对字符数据的读取,Java SE提供了java.io.Reader类,其抽象化了字符数据读入的来源。 针对字符数据的写入,则提供了java.io.Writer类。其抽象化了数据写出的目的地。 Reader与Writer操作了Closeable接口,其父接口为AutoCloseable接口,可尝试自动关闭资源语法。 字符处理装饰器

  • 想要将这些字节数据转换为对应的编码字符,可以使用InputStreamReader、OutputStreamWriter对串流数据打包。 BufferedReader、BufferedWriter可对Reader、Writer提供缓冲区作用,在处理字符输入/输出时,对效率也会有所帮助。 PrintWriter还可以对Writer进行打包,提供print()、println()、format()等方法。 线程

  • 在java中,如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable()接口,流程的进入点是操作在run()方法中。

字符处理装饰器
  • 想要将这些字节数据转换为对应的编码字符,可以使用InputStreamReader、OutputStreamWriter对串流数据打包。
  • BufferedReader、BufferedWriter可对Reader、Writer提供缓冲区作用,在处理字符输入/输出时,对效率也会有所帮助。
  • PrintWriter还可以对Writer进行打包,提供print()、println()、format()等方法。

线程

Thread与Runnable
  • 如果想要为JVM加装CPU,就是创建Thread实例,要启动额外CPU就是调用Thread实例的start()方法,额外CPU执行流程的进入点,可以定义在Runnale接口的run()方法中。操作Runnable接口的好处就是较有弹性,你的类还有机会继承其他类。若继承了Thread,那该类就是一种Thread,通常是为了直接利用Thread中定义的一些方法,才会继承Thread来操作。

  • 撰写多线程程序的方式:

1.将流程定义在Runnable的run()方法中;

2.继承Thread类,重新定义run()方法

线程生命周期
  • Daemon线程:主线程会从main()方法开始执行,直到main()方法结束后停止JVM。如果主线程中启动了额外线程,默认会等待被启动的所有线程都执行完run()方法才中止JVM。 如果一个Thread被标示为Daemon线程,在所有的非Daemon线程都结束时,JVM自动就会终止。

  • Thread基本状态图:用Thread实例start()方法后,基本状态为可执行(Runnable)、被阻断(Blocked)、执行中(Running)。

  • 安插线程:join()表示将线程加入称为另一个线程的流程中,线程使用join()加入至另一个线程时,另一个线程会等待被加入的线程工作完毕,然后在继续它的动作。

  • 停止线程:线程完成run()方法后,就会进入Dead,进入Dead的线程不可以再次调用start()方法,否则会抛出IllegalThreadStateException异常。

ThreadGroup
  • 每个线程都属于某个线程群组,获取目前线程所属线程群组名:
Thread.currentThread().getThreadGroup().getName()
  • ThreadGroup中interrupt()方法可以中断群组中所有线程,setMaxPriority()方法可以设定群组中所有线程最大优先权,activeCount()方法获取群组的线程数量。 未捕捉异常会由线程实例setUncaughtExceptionHandler()设定的Thread.UncaughtExceptionHandler实例处理之后是线程ThreadGroup,然后是默认的Thread.UncaughtExceptionHandler。

并行API

Lock、ReadWriteLock与Condition
  • lock接口主要操作类之一为ReentrantLock,可以达到synchronized的作用。

  • Lock接口还定义了tryLock()方法,如果线程调用tryLock()可以取得锁定会返回true,若无法取得锁定并不会发生阻断,而是返回false。

  • ReadWriteLock接口定义了读取锁定与写入锁定行为,可以使用readLock()、writeLock()方法返回Lock操作对象。

  • StampedLock类可支持了乐观读取操作。 Condition接口用来搭配Lock,最基本用法就是达到Object的wait()、notify()、notifyAll()方法的作用。Condition的await()、signal()、signalAll()方法,可视为Object的wait()、notify()、notifyAll()方法的对应。

使用Executor
  • 使用ThreadPoolExecutor:线程池这类服务的行为实际上是定义在Executor的子接口java.util.concurrent.ExecutorService中,通常会使用java.util.concurrent.Executor的newCacheThreadPool()、newFixedThreadPool()静态方法来创建ThreadPoolExecutor实例,程序看起来较为清楚且方便。

  • 使用ScheduledThreadPoolExecutor:ScheduledExecutorService为ExecutorService的子接口,可以让你进行工作排程。schedule()方法用来排定Runnable或Callable实例延迟多久后执行一次,并返回Future子接口ScheduledFuture的实例,对于重复性的执行,可使用scheduleWithFixedDelay()和scheduleAtFixedRate()方法。

  • 使用ForkJoinPool:ForkJoinPool闲聊了工作窃取演算,其建立的线程如果完成手边任务,会尝试寻找并执行其他任务建立的资额任务,让线程保持忙碌状态,有效利用处理器的能力。ForkJoin框架适用于计算密集式的任务,较不适合用于容易造成线程阻断的场合。

并行Collection简介
  • ConcurrentHashMap是ConcurrentMap的操作类,ConcurrentNavigableMap是ConcurrentMap的子接口,其操作类为ConcurrentSkipListMap,可视为支持并行操作的TreeMap版本。

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

  • 问题1:撰写单线程序、多线程程序的方式差别?
  • 问题1解决方案:操作Runnable接口的好处就是较有弹性,类还有机会继承其他类;若继承了Thread类,那该类就是一种Thread,通常是为了直接利用Thread中定义的一些方法,才会继承Thread来操作。
  • 问题2:对InputStream、Reader与Writer区别,还是有些模糊。
  • 问题2解决方案:

Reader是用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。

Writer是写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。Reader和Writer都属于字符流。

InputStream属于字节流。字节流用于读写二进制文件。

  • ...

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

  • 问题1:P327的代码执行结果总是先执行乌龟走的步数再执行兔子走的步数。


public class TortoiseHareRace2 {
public static void main(String[] args) {
Tortoise tortoise = new Tortoise(10);
Hare hare = new Hare(10);
Thread tortoiseThread = new Thread(tortoise);
Thread hareThread = new Thread(hare);
tortoiseThread.start();
hareThread.start();
}
}
  • 问题1解决方案:待解决。

代码托管

(statistics.sh脚本的运行结果截图)

上周考试错题总结

上周第一次使用云班课答题,还不太习惯,也不记得有哪些错题了。

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  6. 其他加分:

    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:

    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评模板:

  • 博客中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

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

这两章的知识点繁多复杂,还是觉得消化的时间不够,清明小假期会再安排一点时间来学习。

除了感觉知识点太难以外,更明白了API的重要性。看书的时候遇到不懂的代码要尽快查API。养成良好的习惯,自己的Java水平才会得到提升。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/1 20/20
第二周 98/108 1/2 20/40
第三周 401/509 1/3 15/55
第四周 700/1209 1/4 20/75
第五周 632/1841 1/5 20/95 了解Java的异常处理,学习Collection和Map架构
第六周 1040/2881 1/6 13/108 了解串流设计和线程

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

  • 计划学习时间:30小时

  • 实际学习时间:13小时

  • 改进情况:这周学习的时间太短了,会再继续这两章内容。

(有空多看看现代软件工程 课件

软件工程师能力自我评价表
)

参考资料

20155227 2016-2017-2 《Java程序设计》第六周学习总结的更多相关文章

  1. 20155227 2016-2017-2 《Java程序设计》第九周学习总结

    20155227 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联 ...

  2. 20155227 2016-2017-2 《Java程序设计》第二周学习总结

    20155227 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 本周学习的第三章内容与以前学过的C语言有很多共通的地方,学习起来还是比较快的. 主要的内容有 ...

  3. 20155227 2016-2017-2 《Java程序设计》第一周学习总结

    20155227 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 浏览教材,根据自己的理解每章提出一个问题 Java三个平台的区别. JDK.JRE.JVM区 ...

  4. 20155213 2016-2017-2 《Java程序设计》第九周学习总结

    20155213 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC(Java DataBase Connectivity)即java数据库连 ...

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

    20155328 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 16.1 JDBC入门 JDBC是Java联机数据库的标准规范,定义一组标准类与接口,应用程 ...

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

    20155320 2016-2017-2<Java程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...

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

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  8. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

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

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

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

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

随机推荐

  1. kali_metasploit问题

    出现类似提示: Failed to connect to the database: could not connect to server: Connection refused    Is the ...

  2. angular.js中提供的基础方法

    angular.bind angular.callbacks angular.equals /* *Determines if two objects or two values are equiva ...

  3. 使用JAVA进行排序

    利用JAVA完成排序 当我们在进行数据库进行查询的时候,当需要按某个字段来进行排序的时候,可以使用SQL语句来完成排序,可以升序,也可以降序.JAVA中的Collections类也可以完成这种操作,S ...

  4. Python新式类和经典类的区别

    @Python新式类和经典类的区别 class ClassicClass(): pass class NewStyleClass(object): pass x1 = ClassicClass() x ...

  5. 用Qt制作的Android独立游戏《吃药了》公布

           一个多月的努力最终有了回报,我自己研究制作的独立游戏<吃药了>.最终在360应用商店上线了.        这一款游戏呢.使用的是Qt开发的.事实上开发这款简单的应用之前.我 ...

  6. [19/04/25-星期四] GOF23_结构型模式(适配器模式、代理模式)

    一.引言 结构模式:核心作用就是从程序的结构上实现松耦合,从而扩大整体的类结构,用来解决更大的问题. 二.适配器模式(adapter) 生活中假设笔记本是标准的USB接口但是外置键盘是圆形接口,这时候 ...

  7. Java50道经典习题-程序21 求阶乘

    题目:求1+2!+3!+...+20!的和分析:使用递归求解 0的阶乘和1的阶乘都为1 public class Prog21{ public static void main(String[] ar ...

  8. J2EE从下载到配置成功

    1,首先在www.oracle.com网站下载JDK 2 3 4,可以根据自己的需要下载相应的JDK 5,在安装的过程中要将JDK的安装路径和JRE的安装路径安装在不同文件夹中以示区别,例如 6,配置 ...

  9. 接口测试Jmeter+Fiddler组合

    接口测试Jmeter+Fiddler组合 在使用完Jmeter在做接口测试之后,个人感觉Jmeter比loadrunner好用,原因是界面操作更加直观,不必像loadrunner在写接口请求函数的时候 ...

  10. Reading Software Defined Traffic Measurement with OpenSketch

    NSDI '13 概要 OpenSketch是一个通用的.抽象的测量框架, 与SDN 网络架构类似, OpenSketch 提出将测量控制层和数据层解耦. 数据层运行设为可动态配置的3阶段流水线, 首 ...