教材内容详解

这一次主要学习的是第十章与第十一章的内容。主要讲述了串流,字符处理和线程以及并行API。

  1. 输入输出

串流:Java中的数据有来源(source)和目的地(destination),衔接两者的就是串流对象2串流设计:在不知道限定数据来源和目的地时,也可以依赖抽象的InputStream和Outstream来编写一个dump()方法,方便以后使用3InputStream和OutputStream:在java中,输入串流代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutputStream

串流的继承结构:

标准输入和输出:System.in和System.out就是InputStream和OutStream的实例,然而System.in通常很少直接操作InputStream相关方法,可以转而使用setIn()来指定InputStream实例,如System.setIn(new FileInputStream(args [0]))
FileInputStream和FileOutputStream:FileInputStream是InputStream的子类,一旦创建文档就开启,就可以用来读取数据,FileOutputStream是outStream实例,一旦创建就可以写出数据,且不使用时都需要用close()来关闭
ByteArrayInputStream与ByteArrayOutputStream可以指定byte数组创建实例,创建后将byte数组当作数据源进行读取
以上各关键词其实都是操作了InputStream和OutStream中的read()和write()抽象方法
3. 串流处理装饰器:

定义:InputStream和OutputStream都只提供串流的基本操作,而想对数据进行加工处理时,就要使用打包器类,如Scanner,装饰器就是这些对数据进行了一些加工处理,例如缓冲、串行化、数据装换等
BufferInputStream与BufferOutputStream:将数据尽量地读取足够数据至内存的缓冲区,减少从来源直接读取数据的次数,从而提高效率(访问内存的速度较快)
DataInputStream与DataOutputStream:提供读取写入java基本类型的方法,这些方法会自动在指定的类型和字节中转换
2. 线程
1.单线程程序:启动的程序从 main() 程序进入点开始至结束只有一个流程

多线程程序:程序有多个流程
.JVM是台虚拟计算机,只安装一颗称为主线程的CPU,可执行main()定义的执行流程。如果想要为JVM加装CPU,就是创建Thread实例,要启动额外CPU就是调用Thread实例的start()方法,额外CPU执行流程的进入点,可以定义在Runnale接口的run()方法中。
setDeamon()方法用来设定一个线程是否为Daemon线程。 在调用Thread实例start()方法后,基本状态为可执行(Runnable)、被阻断(Blocked)、执行中(Running)。 使用Thread.sleep()会让线程进入Bocked状态。 当线程使用join()加入至另一个线程时,另一个线程会等待被加入的线程工作完毕,然后在继续它的动作,join()的意思表示将线程加入称为另一个线程的流程中。 线程完成run()方法后,就会进入Dead,进入Dead的线程不可以再次调用start()方法,否则会抛出IllegalThreadStateException异常。

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

1.start()方法和run()方法的区别:
只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码。

2.volatile关键字的作用:
(1)多线程主要围绕可见性和原子性两个特性而展开,使用volatile关键字修饰的变量,保证了其在多线程之间的可见性,即每次读取到volatile变量,一定是最新的数据

(2)代码底层执行不像我们看到的高级语言----Java程序这么简单,它的执行是Java代码-->字节码-->根据字节码执行对应的C/C++代码-->C/C++代码被编译成汇编语言-->和硬件电路交互,现实中,为了获取更好的性能JVM可能会对指令进行重排序,多线程下可能会出现一些意想不到的问题。使用volatile则会对禁止语义重排序,当然这也一定程度上降低了代码执行效率
3.synchronized和ReentrantLock的区别:
synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:

(1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁
(2)ReentrantLock可以获取各种锁的信息
(3)ReentrantLock可以灵活地实现多路通知

代码调试中的问题和解决办法:

1.运行书上p313页的代码产生了如果将out.println(Member.load("B1234"));中的B1234改为名字能不能正确输出的想法,于是进行尝试。
out.println(Member.load("Justin")); out.println(Member.load("Monica")); out.println(Member.load("Irene"));
结果出现了错误。
通过检索错误并且重新看书上的内容,发现有可能是因为Memeber类中文件名为Member的会员号码,而不是会员姓名,导致调用Member.laod()类时只能指定号码而出现错误。于是对Member.java中的程序进行如下修改。
`public void save() throws IOException {
try(DataOutputStream output =
new DataOutputStream(new FileOutputStream(name))) {
output.writeUTF(number);
output.writeUTF(name);
output.writeInt(age);
}
}

public static Member load(String number) throws IOException {
Member name;
try(DataInputStream input =
new DataInputStream(new FileInputStream(number))) {
name = new Member(
input.readUTF(), input.readUTF(), input.readInt());
}
return name;
}`
最终编译成功。

代码托管

上周考试错题总结

结对及互评

评分标准

  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

感悟

利用jdk + Editplus 熟悉java.lang.;java.io.;java.util;java.sql.*;这四个核心包中各个大类的名字以及他们常见的方法,(不知道走了弯路没)同时学习《THINKING IN JAVA》的面向的思想,学习Java的面向对象的编程语言的特性的地方,比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。后来觉的自己学的很没系统,知识点连不起来使用,于是选择了“新东方职业培训”,由于有了点基础,学习到一些地方总有中豁然开然的感觉。从每个老师身上都学到了不少东西,不仅仅是编程的技巧,IDE的使用,更多的是思维模式,编码规范以及项目开发中的注意事项。接下来的学习是java web开发的学习:在Servlet/JSP的学习中,我觉的Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。Java Web编程学习的重点我放在了Web Application的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照MVC设计模式的要求,运用Servlet和JSP分别完成不同的逻辑层,掌握如何在Servlet和JSP之间进行流程的控制和数据的共享,以及Web Application应该如何配置和部署。

学习进度条

        | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|

| -------- | :----------------😐:----------------😐:---------------: |:-----😐
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 200/200 | 2/2 | 20/20 | |
| 第二周 | 300/500 | 2/4 | 19/38 | |
| 第三周 | 600/1000 | 3/7 | 22/60 | |
| 第四周 | 450/1300 | 2/9 | 30/90 | |