20145337 《Java程序设计》第六周学习总结
教材学习内容总结
输入\输出
InputStream与OutputStream
- 从应用程序角度来看,如果要将数据从来源取出,可以使用输入串流;如果要将数据写入目的地,可以使用输出串流。在Java中,输入串流代表对象为java.io.InputStream实例,输出串流代表对java.io.OutputStream实例。无论数据源或目的地为何,只要设法取得InputStream或OutputStream的实例,接下来操作输入/输出的方式都是一致的,无须理会来源或目的地的真正形式。
-
FileReader、FileWriter则可以对文档做读取与写入,读取或写入时默认会使用操作系统默认编码来做字符转换。在启动JVM时,可以指定-Dfile.encoding来指定FileReader、FileWriter所使用的编码。
-
Reader、Writer中也有一些装饰器类,InputStreamReader和OutputStreamWriter可以对串流数据打包,BufferedReader、BufferedWriter可对Reader、Writer提供缓冲区作用,在处理字符输入/输出时,对效率也会有所帮助。PrintWriter与PrintStream使用上极为类似,不过除了可以对OutputStream打包之外,PrintWriter还可以对Writer进行打包,提供print()、println()、format()等方法。
线程与并行
-
在java中,如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run()方法中。
在java中,从main()开始的流程会由主线程执行,可以创建Thread实例来执行Runnable实例定义的run()方法。 -
JVM是台虚拟计算机,只安装一颗称为主线程的CPU,可执行main()定义的执行流程。如果想要为JVM加装CPU,就是创建Thread实例,要启动额外CPU就是调用Thread实例的start()方法,额外CPU执行流程的进入点,可以定义在Runnale接口的run()方法中。
-
操作Runnable接口的好处就是较有弹性,你的类还有机会继承其他类。若继承了Thread,那该类就是一种Thread,通常是为了直接利用Thread中定义的一些方法,才会继承Thread来操作。
-
线程存取同一对象相同资源时可能引发竞速情况,这样的类为不具备线程安全的类;
-
每个对象都会有个内部锁定,或称为监控锁定。
教材上的代码
```
package cc.openhome;
import java.util.concurrent.BlockingQueue;
public class Consumer3 implements Runnable {
private BlockingQueue<Integer> productQueue;
public Consumer3(BlockingQueue<Integer> productQueue) {
this.productQueue = productQueue;
}
public void run() {
System.out.println("消费者开始消耗整数......");
for(int i = 1; i <= 10; i++) {
try {
int product = productQueue.take();
System.out.printf("消费者消费整数 (%d)%n", product);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}
}
}
```
```
package cc.openhome;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Download3 {
public static void main(String[] args) throws Exception {
URL[] urls = {
new URL("http://openhome.cc/Gossip/Encoding/"),
new URL("http://openhome.cc/Gossip/Scala/"),
new URL("http://openhome.cc/Gossip/JavaScript/"),
new URL("http://openhome.cc/Gossip/Python/")
};
String[] fileNames = {
"Encoding.html",
"Scala.html",
"JavaScript.html",
"Python.html"
};
ExecutorService executorService = Executors.newCachedThreadPool();
new Pages(urls, fileNames, executorService).download();
executorService.shutdown();
}
}
```
本周代码托管截图
其他(感悟、思考等,可选)
这两章的学习较八九章更为吃力,这周实验多多,安排给看书的时间比较少,还是决定把书上的代码都亲自敲,只是看还是有点似懂非懂。编辑实验练习题目时就发现缺少自己编代码的过程,不过还是把书上的知识点先看明白吧
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 | |
第五周 | 200/1300 | 2/9 | 15/90 | |
第六周 | 200/1300 | 2/9 | 15/90 |