20155231 2016-2017-2 《Java程序设计》第6周学习总结
2017-04-02 21:09
489 查看
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)
结对及互评
评分标准
正确使用Markdown语法(加1分):不使用Markdown不加分
有语法错误的不加分(链接打不开,表格不对,列表不正确...)
排版混乱的不加分
模板中的要素齐全(加1分)
缺少“教材学习中的问题和解决过程”的不加分
缺少“代码调试中的问题和解决过程”的不加分
代码托管不能打开的不加分
缺少“结对及互评”的不能打开的不加分
缺少“上周考试错题总结”的不能加分
缺少“进度条”的不能加分
缺少“参考资料”的不能加分
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
本周有效代码超过300分行的(加2分)
一周提交次数少于20次的不加分
其他加分:
周五前发博客的加1分
感想,体会不假大空的加1分
排版精美的加一分
进度条中记录学习时间与改进情况的加1分
有动手写新代码的加1分
课后选择题有验证的加1分
代码Commit Message规范的加1分
错题学习深入的加1分
点评认真,能指出博客和代码中的问题的加1分
结对学习情况真实可信的加1分
扣分:
有抄袭的扣至0分
代码作弊的扣至0分
迟交作业的扣至0分
点评模板:
博客中值得学习的或问题:xxx
xxx
...
代码中值得学习的或问题:
xxx
xxx
...
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
参考示例
点评过的同学博客和代码
本周结对学习情况20155206
结对照片
结对学习内容
输入/输出
线程与并行API
上周错题
上周博客互评情况
20155323
20155202
20155304
20155231
20155214
20155232
其他(感悟、思考等,可选)
本周采取了新的考试方式,虽然发生了一点意外,但这都不重要,重要的是发现了自己还有许多问题存在,这个系统考试暴露了自己对代码理解不够,学习有待加强。学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第6周 | 608/1774 | 1/6 | 14/108 |
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:软件工程软件的估计为什么这么难,软件工程 估计方法
计划学习时间:14小时
实际学习时间:20小时
改进情况:加快学习效率
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
Java学习笔记(第8版)《Java学习笔记(第8版)》学习指导
...
相关文章推荐
- 20155204 2016-2017-2 《Java程序设计》第6周学习总结
- 20155205 2016-2017-2 《Java程序设计》第6周学习总结
- 20155324 2016-2017-2 《Java程序设计》第6周学习总结
- 20145209 2016-2017-2 《Java程序设计》第6周学习总结
- 20155217 2016-2017-2 《Java程序设计》第6周学习总结
- 20155203 2016-2017-4 《Java程序设计》第6周学习总结
- 20155210潘滢昊 2016-2017-2 《Java程序设计》第6周学习总结
- 20155314 2016-2017-2 《Java程序设计》第6周学习总结
- 2016-2017-20155329 《Java程序设计》第6周学习总结
- 20155218 2016-2017-2 《Java程序设计》第6周学习总结
- 20155231 2016-2017-2 《Java程序设计》第4周学习总结
- 20155234 2016-2017-2 《Java程序设计》第6周学习总结
- 20155231 2016-2017-2 《Java程序设计》第3周学习总结
- 20155226 2016-2017-2 《Java程序设计》第6周学习总结
- 学号20155311 2016-2017-2 《Java程序设计》第6周学习总结
- 20155219 2016-2017-2 《Java程序设计》第6周学习总结
- 20145202马超 2016-2017-2 《Java程序设计》第6周学习总结
- 20155231 2016-2017-2 《Java程序设计》第1周学习总结
- 20155322 2016-2017-2 《Java程序设计》第6周学习总结
- 20155237 2016-2017-2 《Java程序设计》第6周学习总结