20155302 2016-2017-2 《Java程序设计》第6周学习总结
教材学习内容总结
Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的。
InputStreamReader是InputStream和Reader之间的桥梁,由于System.in是字节流,需要用它来包装之后变为字符流供给 BufferedReader使用。
InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。 继承自InputStream 的流都是向程序中输入数据的,且数据单位为字节(8bit)。
OutputStream的基本方法: void write(int b) throws IOException 向输出流写入一个字节数据 void flush() throws IOException 将输出流中缓冲的数据全部写出到目的地
Reader的基本方法: int read() throws IOException 读取一个字符以整数形式返回,如果返回-1已到输入流的末尾
Writer的基本方法 void write(int c) throws IOException 向输出流写入一个字符数据 void write(String str) throws IOException将一个字符串中的字符写入到输出流 void write(String str,int offset,int length) 将一个字符串从offset开始的length个字符写入到输出流 void flush() throws IOException 将输出流中缓冲的数据全部写出到目的地
java.lang.Thread是Java API中的基础线程类。定义线程的方法有两种:一种是制作Thread的子类,覆盖run()method,然后实例化你的Thread子类;另一种是定义实现了Runnable method的类(也就是定义run() method),然后传递此Runnable对象的instance给Thread()构造函数。
线程可以以不同的优先级运行。指定优先级的线程通常会在已无具较高优先级的线程等待时才会运行。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。
线程完成run()方法后,就会进入Dead,进入Dead的线程不可以再次调用start()方法,否则会抛出IllegalThreadStateException。
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。
每个对象都会有一个内部锁定,或称为监控锁定。被标示为synchronized的区块将会被监控,任何线程要执行synchronized区块都必须先取得指定的对象锁定。
教材学习中的问题和解决过程
- 问题1:一个线程运行时发生异常会怎样?
- 问题1解决方案:如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候JVM会使用Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。
- 问题2:为什么wait和notify方法要在同步块中调用?
- 问题2解决方案:主要是因为Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。还有一个原因是为了避免wait和notify之间产生竞态条件。
代码调试中的问题和解决过程
问题1:如下代码为什么打印出来结果只有1次输出,明明使用了2次println啊??
import java.io.*;public class BasicFileOutput {static String file = "BasicFileOutput.out"; public static void main(String[] args)throws IOException {BufferedReader in = new BufferedReader(new StringReader(BufferedInputFile.read("BasicFileOutput.java")));PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file)));int lineCount = 1;String s;while((s = in.readLine()) != null )out.println(lineCount++ + ": " + s);out.close();// Show the stored file:System.out.println(BufferedInputFile.read(file));}}
问题1解决方案:经过我的结对同学学霸秦诗茂的指导与讲解,我明白了,第一个println是输出到文件里去了。第二个println才是输出到控制台。所以我看到在控制台只有一行输出。
代码托管
上周考试错题总结
- 现有:list是⼀一个合法的集合引⽤用getCollection()返回⼀一个合法集合的引⽤用哪个是合法的?(B,E)
A.or(Object o ; list)
B.for(Object o : getCollection())
C.for(Object o : list.iterator())
D.for(lterator i ; list.iterator() ; i.hasNext () )
E.for(lterator i=list.iterator(); i.hasNext (); )
现有
public class Demo{public static void main (String[] args){ List al=new ArrayList();a1.add("l");a1.add("2");a1.add("2");a1.add("3"); System.out.println (al);}}上述程序执⾏行行后的输出是哪项?A.[1,2,3]B.[1,2,3,3]C.[1,2,2,3]D.[2,1,3,2]
Which of the following methods will not compile? :(B,D)
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();
}
- 表示键值对概念的接⼝口是?:(D)
A.Set
B.List
C.Collection
D.Map
- 创建⼀一个只能存放String的泛型ArrayList的语句句是哪项?:(B)
A.ArrayList al=new ArrayList(); B.ArrayList al=new ArrayList() C.ArrayList al=new ArrayList(); D.ArrayList al =new List();
结对及互评
评分标准
- 正确使用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
参考示例
点评过的同学博客和代码
- 本周结对学习情况
- 20155322
- 结对照片
- 结对学习内容
串流继承的内容和架构
- 第十章与第十一章课后练习
代码调试中遇到的困难和问题
- 线程内容中synchronized,wait(),notify(),notifyAll()等使用方法和环境
- 上周博客互评情况
- 20155333
- 20155233
- 20155230
- 20155339
- 20155306
其他(感悟、思考等,可选)
本周的学习由于其他科目实验,在代码量上有些不足,希望自己下周可以再在代码上下更多的功夫,只有自己动手敲代码,在做中学才是最好的学习手段和方式,对于书中不好理解的知识要在仔细思考的条件下百度或者计时问老师,不要让盲点陪自己过夜,边学边反思自己哪里做的不够好,及时修正。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 20/20 | 2/2 | 20/20 | |
第二周 | 140/160 | 2/4 | 18/38 | |
第三周 | 113/273 | 1/5 | 20/58 | |
第四周 | 335/608 | 1/6 | 20/78 | |
第五周 | 1159/1408 | 1/7 | 30/108 | |
第六周 | 452/1860 | 1/8 | 20/128 |