学号 《Java程序设计》第X周学习总结
教材学习内容总结
10 输入/输出
10.1 InputStream与OutputStream
- Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象。
- FileIntputStream是InputStream的子类,用于衔接文档以读入数据,FileOutStream是OutputStream的子类,用于衔接文档以写出数据。
- 在不使用InputStream与OutputStream时,必须使用close()方法关闭串流。由于InputStream与OutputStrem操作了java.io.Closeable接口,其父接口为java.lang.AutoCloseable接口。
10.1.2
1.标准输入/输出
- 可以使用System的setIn()方法指定InputStream实例,重新指定标准输入来源。
2.FileInputStream与FileOutputStream
10.2字符处理类
- 针对字符数据的读取,Java SE提供了java.io.Reader类,其抽象化了字符数据读入的来源。
- 针对字符数据的写入,则提供了java.io.Writer类。其抽象化了数据写出的目的地。
- 在启动JVM时,可以指定-Dfile.encoding来指定FileReader、FileWriter所使用的编码。
import java.io.IOException;
import static java.lang.System.out;
public class MemberDemo {
public static void main(String[] args) throws IOException {
Member[] members = {
new Member("B1234", "Justin", 90),
new Member("B5678", "Monica", 95),
new Member("B9876", "Irene", 88)
};
for(Member member : members) {
member.save();
}
out.println(Member.load("B1234"));
out.println(Member.load("B5678"));
out.println(Member.load("B9876"));
}
}
运行结果:
10.2.2字符处理装饰器
在Java中,对串流可以有装饰器,那么对字符串也有装饰器书中介绍了InputStreamREader与OutputStreamWriter,BufferedReader与BufferedWriter和PrintWriter这三种打包器。
1.InputStreamREader与OutputStreamWriter:
在建立InputStreamREader与OutputStreamWriter时可以指定编码,对字节数据转化为相应的编码字符。
2.BufferedReader与BufferedWriter:
BufferedReader与BufferedWriter可以将转换后的数据做缓冲处理,以增加读取效率。
3.PrintWriter:
PrintWriter与PrintStreame十分相似既可以对OutputStream打包,也可以对Writer打包。
11 线程与并行API
11.1 线程
在java中,如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run()方法中。
package Thread;
import static java.lang.System.out;
public class TortoiseHareRace {
public static void main(String[] args) {
boolean[] flags = {true, false};
int totalStep = 10;
int tortoiseStep = 0;
int hareStep = 0;
out.println("龟兔赛跑开始...");
while(tortoiseStep < totalStep && hareStep < totalStep) {
tortoiseStep++;
out.printf("乌龟跑了 %d 步...%n", tortoiseStep);
boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
if(isHareSleep) {
out.println("兔子睡着了zzzz");
} else {
hareStep += 2;
out.printf("兔子跑了 %d 步...%n", hareStep);
}
}
}
}
它只有一个流程,它的循环控制为乌龟或兔子走完十步,比赛结束。按照程序由上而下的运行原则,每次都是乌龟先递增步数,然后再是兔子随机睡觉或走两步,两者好像并不是同步的,这样对兔子来说并不公平,所以,为了设计一个更加公平的比赛程序,我们希望两者可以不受程序运行过程中先后运行顺序的干扰,同时进行步数的移动。这里就用到了书中介绍到的多线程运行程序。
package Thread;
import static java.lang.System.out;
public class TortoiseHareRace {
public static void main(String[] args) {
boolean[] flags = {true, false};
int totalStep = 10;
int tortoiseStep = 0;
int hareStep = 0;
out.println("龟兔赛跑开始...");
while(tortoiseStep < totalStep && hareStep < totalStep) {
tortoiseStep++;
out.printf("乌龟跑了 %d 步...%n", tortoiseStep);
boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
if(isHareSleep) {
out.println("兔子睡着了zzzz");
} else {
hareStep += 2;
out.printf("兔子跑了 %d 步...%n", hareStep);
}
}
}
}
11.1.4关于ThreadGroup
- ThreadGroup的某些方法,可以对群组中所有线程产生作用。interrupt()方法可以中断群组中所有线程,setMaxPriority()方法可以设定群组中所有线程最大优先权。activeCount()方法获取群组的线程数量 。
- 未捕捉异常会由线程实例setUncaughtExceptionHandler()设定的Thread.UncaughtExceptionHandler实例处理之后是线程ThreadGroup,然后是默认的Thread.UncaughtExceptionHandler。
11.2并行API
11.2.1Lock、ReadWriteLock与Condition
1.使用Lock
- lock接口主要操作类之一为ReentrantLock,可以达到synchronized的作用。
- Lock接口还定义了tryLock()方法,如果线程调用tryLock()可以取得锁定会返回true,若无法取得锁定并不会发生阻断,而是返回false。
4.使用Condition
Condition接口用来搭配Lock,最基本用法就是达到Object的wait()、notify()、notifyAll()方法的作用。
class Resource {
private String name;
private int resource;
Resource(String name, int resource) {
this.name = name;
this.resource = resource;
}
String getName() {
return name;
}
synchronized int doSome() {
return ++resource;
}
synchronized void cooperate(Resource resource) {
resource.doSome();
System.out.printf("%s 整合 %s 的资源%n",
this.name, resource.getName());
}
}
public class DeadLockDemo {
public static void main(String[] args) {
Resource resource1 = new Resource("resource1", 10);
Resource resource2 = new Resource("resource2", 20);
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
resource1.cooperate(resource2);
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
resource2.cooperate(resource1);
}
});
thread1.start();
thread2.start();
}
}
本周代码托管截图
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 1/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 18/38 | |
第三周 | 500/1000 | 1/4 | 22/60 | |
第四周 | 300/1300 | 1/5 | 30/90 | |
第五周 | 300/1600 | 1/6 | 30/160 | |
第六周 | 700/2300 | 2/7 | 30/190 |