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

教材学习内容总结

学习目标

  • 理解流与IO
  • 理解InputStream/OutPutStream的继承架构
  • 理解Reader/Writer继承架构
  • 会使用装饰类
  • 会使用多线程进行并发程序设计

第十章:输入/输出

InputSream与OutputStream

  • Java中,输入串流代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutputStream实例。
  • 在进行InputStream与OutputStream的相关操作时若发生错误,会抛出java.io.IOException异常。不使用InputStream与OutputStream时必须使用close()方法关闭串流。
  • FileInputStream是InputStream的子类,用于衔接文档以读入数据,FileOutputStream是OutputStream的子类,用于衔接文档以读出数据。
  • System.in与System.out分别是InputStream与PrintStream的实例,分别代表标准输入和标准输出。标准输出导向至文档,执行程序时使用>。例如>java Hello>Hello.txt,使用>>则是附加信息。
  • System.err为printStream实例,称为标准错误输出串流,它是用来立即显示错误信息。
  • FileInputStream主要操作InputStream的read()抽象方法,FileOutputStream主要操作OutputStream的write()抽象方法。FileInputStream、FileOutputStream在读取、写入文档时,以字节为单位。
  • 打包器类:使用打包器类可以为输入/输出的数据做加工处理。常用打包器有:
  • +具有缓冲作用的BufferedInputStream、BufferedOutputStream(read()和write()可以到这里看是否有缓存的数据,节省时间)
  • +具备数据处理作用的DateInputStream、DateOutputStream(提供读取、写入java基本数据类型的方法)
  • +具备对象串行化能力的ObjectInputStream、ObjectOutputStream
  • java.io.Serializable()接口没有定义任何方法,只用来标示这个对象是可以串行化的。
  • 串行化时不希望被写出的数据成员可以标上transient。

字符处理类

  • Reader与Writer操作了Closeable接口,其父接口为AutoCloseable接口。Reader读入时先置入char数组中。
  • FileReader是一种Reader,主要用于读取文档并将读到的数据转换为字符,StringWriter是一种Writer,可以将字符数据写至StringWriter,最后使用toString()方法取得字符串,代表所有写入的字符数据。
  • 可以指定-Dfil.encoding来指定FileReader、FileWriter所使用的编码。
  • 常用字符处理装饰器:InputStreamReader与OutputStreamWriter对串流数据打包;BufferedReader与BufferedWriter提供缓存区作用;PrintWriter对OutputStream和Writer打包,提供print()、println()、format()等方法

第十一章:线程与并行API

线程

  • 在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是在run()方法中,加装的额外CPU就是创建Thread实例,执行流程的进入点也定义在这儿。另一个撰写多线程程序的方式,就是继承Thread类,重新定义run()方法,重新定义也可以执行其中的流程。
  • 在某些必须以匿名类语法构建Thread的场合,可以考虑用Lambda表达式操作Runnable,然后再用以建立Thread。例如:
Thread someThread=new Thread(){
public void run(){
//方法操作内容
}
};
可以改为用以下较简洁的方式操作:
Thread someThread=new Thread((->{
//方法操作内容
}};
  • 线程周期

并行API

  • 多线程程序可基于java.util.concurrent包中的API建立更稳固的并行应用程序,.util.concurrent包中提供接口:
  • +Lock:Lock接口的额主要操作类之一为ReentrantLock,可以达到synchronized的作用,调用其中的try Lock()取得锁定返回true,无法取得时不会中断而是返回flase。
  • +ReadWriteLock接口定义了读取锁定与写入锁定行为,可以使用readLock()、writeLock()方法返回Lock操作对象。它在没有任何读取或写入锁定时才可以取得写入锁定,可以用StampedLock类解决。例如:
  • private StampedLock lock=new stampedLock();
  • 线程若调用get()方法进行读取操作,先取得读取锁定,这样其他线程后续也可再取得读取锁定。
  • +Condition,其中的await()、signal()、signalAll()方法可视为Object的wait()、notify()、notifyAll()方法的对应。

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

  • 问题1:synchronized互斥性与可见性
  • 问题1解决方案:在java中对于可见性的要求,可以使用volatile达到变量范围,在变量上声明volatile,表示变量是不稳定、易变的,也就是可能在多线程下存取,其存取一定是在共享内存中进行,代码如下:
package cc.openhome;

class Variable1 {
static int i = 0, j = 0; static void one() {
i++;
j++;
} static void two() {
System.out.printf("i = %d, j = %d%n", i, j);
}
} public class Variable1Test {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
while (true) {
Variable1.one();
}
});
Thread thread2 = new Thread(() -> {
while (true) {
Variable1.two();
}
}); thread1.start();
thread2.start();
}
}
  • 问题2:P334Thread JoinDemo.java中后面的解释说没有加jion()最后一行的描述会先执行完毕,是因为ThreadB使用了sleep()。我没有在程序中看到sleep()在哪儿操作?
  • 问题2解决方案:应该是ThreadB属于Thread的的子类,可直接使用Thread中定义的一些方法。
  • 问题3:使用Condition提高效率?
  • 问题3解决方案:一个Condition对象可代表有一个等待集合,可以重复调用Lock的newCondition(),取得多个Condition实例,这代表了可以有多个等待集合。而p362中改写的Clerk类,因为使用了一个Condition,所以实际上也只有一个等待集合,作用将类似11.11.6节中的Clerk类。如果有两个等待集合:一个给生产者线程用,一个给消费者线程用,生产者只通知消费者等待集合,消费者只通知生产者等待集合,会比较有效率。

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

  • 问题1:p343页代码中的DeadLockDemo为什么会发生死结情况?而我的没有发生?

  • 问题1解决方案::因为两个线程在执行cooparate()方法取得目前Resource锁定后,尝试调用另一Resource的doSome(),因无法取得另一Resource的锁定而阻断。会不会发生死结是几率性问题。

  • 问题2:如何解决死结

  • 问题2解决方案:线程因无法同时取得两个Resource的锁定时,干脆释放已取得的锁定,就可以解决问题;

代码托管

本周代码量:



总代码量:

上周考试错题总结

  • 现有:

    list是一个合法的集合引用,getCollection()返回一个合法集合的引用,哪个是合法的?
for(Object o  :  getCollection());
for(lterator i=list.iterator(); i.hasNext  ();  )
  • Which of the following methods will not compile?

    :
private void method2(int age) {
if (age > 30)
throw Exception();
}
protected double method4() throws Exception {
throw new Throwable();
}
  • 下列属于非受检异常的是哪项?

    :(OutOfMemoryError)

结对及互评

评分标准

  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

  • 参考示例

点评过的同学博客和代码

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

本周采取了新的考试方式,虽然发生了一点意外,但这都不重要,重要的是发现了自己还有许多问题存在,这个系统考试暴露了自己对代码理解不够,学习有待加强。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第6周 608/1774 1/6 14/108

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

耗时估计的公式

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

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

  • 计划学习时间:14小时

  • 实际学习时间:20小时

  • 改进情况:加快学习效率

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

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

参考资料

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

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

    20155305 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC入门 JDBC简介 1.JDBC是java联机数据库的标准规范,它定义了一组标准类与 ...

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

    20155331 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC是什么? JDBC代表Java数据库连接,这对Java编程语言和广泛的数据库之间独立 ...

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

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

  4. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  5. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

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

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

  7. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

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

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

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

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  10. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

随机推荐

  1. java中父进程与子进程

    http://blog.csdn.NET/seelye/article/details/8269705

  2. python之tkinter使用-复选框操作

    # tkinter复选框操作 import tkinter as tk root = tk.Tk() root.title('问卷调查') root.geometry('220x80') # 设置窗口 ...

  3. HS BDC HDU - 3472(混合欧拉路径)

    题意: 就是混合欧拉路径板题 解析: 欧拉路径加一条t_ ---> s_  的边就变成了欧拉回路,所以利用这一点,如果存在两个奇点,那么这两个奇点出度大的是s_,入度大的是t_,加一条t_ -- ...

  4. Trailing Zeroes (III) LightOJ - 1138(二分)

    You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in d ...

  5. hdu 6393 Traffic Network in Numazu (树链剖分+线段树 基环树)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6393 思路:n个点,n条边,也就是基环树..因为只有一个环,我们可以把这个环断开,建一个新的点n+1与之相 ...

  6. Educational Codeforces Round 25 A,B,C,D

    A:链接:http://codeforces.com/contest/825/problem/A 解题思路: 一开始以为是个进制转换后面发现是我想多了,就是统计有多少个1然后碰到0输出就行,没看清题意 ...

  7. Mercurial(Hg)基本操作

    Mercurial(Hg)基本操作 来源 https://www.cnblogs.com/gb2013/archive/2012/05/18/Mercurial_Basic.html Mercuria ...

  8. MT【27】对数方程组求范围

    解答:3 评论:此类题目通性通法为换元后化归为线性规划问题.当然不等式凑配也是常见技巧,只是容易范围扩大或者缩小.

  9. Leetcode 7.反转整数 By Python

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...

  10. Gym 100971J-Robots at Warehouse

    题目链接:http://codeforces.com/gym/100971/problem/J Vitaly works at the warehouse. The warehouse can be ...