20145230 《Java程序设计》第6周学习总结
教材学习内容
串流设计的概念###
Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象。如果要将数据从来源取出,可以使用输入输入串流,如果要将数据写入目的地,可以使用输出串流。在Java中,输入串流代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutputStream实例。
串流继承架构###
System.in与System.out分别是InputStream和PrintStream的实例,分别代表标准输入与标准输出,以个人计算机而言,通常对应至文本模式中的输入与输出。因为文本模式下通常是取得整行用户输入,因此较少直接操作InputStream相关方法,可以使用System的setIn()方法指定InputStream实例,重新指定标准输入来源。
串流处理装饰器###
InputStream、OutputStream提供串流基本操作,如果想要为输入/输出的数据做加工处理,则可以使用打包器类。Scanner类就是打包器,其接受InputStream实例。由于这些类本身并没有改变InputStream、OutputStream的行为,只不过在InputStream取得数据后,再做一些加工处理,或者是输出时做一些加工处理,再交由OutputStream真正进行输出,因此又称它们为装饰器。
字符处理类###
针对字符数据的读取,java SE提供了java.io.Reader类,其抽象化了字符数据读入的来源。针对字符数据的写入,则提供了java.io.Writer类,其抽象化了数据写出的目的地。StringReader可以将字符串打包,当作读取来源,StringWriter则可以作为写入目的地,最后用toString()取得所有写入的字符组成的字符串。CharArrayReader、CharArrayWriter则类似,将char数组当作读取来源以及写入目的地。
线程简介###
在java中,如果想在main()以外的独立设计流程,则可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run()方法中。在java中,从main()开始的流程会由主线程执行,可以创建Thead实例来执行Runnable实例定义的run()方法。
Thread与Runnable
如果想要为JVM加装CPU,就是创建Thread实例,要启动额外CPU就是调用Thread实例的start()方法。额外CPU执行流程的进入点,可以定义在Runnable接口的run()方法中。操作Runnable接口的好处就是较有弹性,你的类还有机会继承其他类。若继承了Thead,,那该类就是一种Thread,通常是为了直接利用Thread中定义的一些方法,才会继承Thread来操作。
线程生命周期
主线程会从main()方法开始执行,直到main()方法结束后停滞JVM。如果主线程中启动了额外线程,默认会等待被启动的所有线程都执行完run()方法才终止JVM。如果一个Thead被表示为Daemon线程,在所有的非Daemon线程都结束时,JVM自动就会终止。
关于ThreadGroup
每个线程产生都属于某个线程群组,线程产生时,都会归入某个线程群组,这视线程实在那个群组中产生的,如果没有指定,则归入产生孩子线程的线程群组。也可以自行指定线程群组,线程一旦归入某个群组,就无法再更换。java.lang.ThreadGroup类正如其名,也可以自行指定线程群组。
并行API
基于Thread类和Runnable接口编程很容易实现基本的并行编程任务,但实现复杂的并行程序就会比较困难,因为要详细考虑资源的同步访问以及设计必要数据结构支持同步访问。从Java5后,Java平台提供了java.util.concurrent包以及HighLevelAPI简化并行编程模型,并提供了很多支持同步访问数据结构满足编程需要。Lock(锁对象):相对与Thread模型的隐式的锁对象,Lock提供了显式的锁操作从而简化应用程序。Executors:提供了一组HighLevelAPI用来执行和管理并行任务。 ConcurrentCollections(并行集合):包含了一组支持并行处理的数据结构,大大简化了并行编程难度。AtomicVariables(原子变量):减少了同步操作并且避免数据不一致。Fork/Join框架:提供了进程操作的支持。
教材学习中的问题和解决过程
在敲P339页Thread ArrayListDemo.java时出现了ArrayIndexOutOfBoundsException异常,但我是按书上代码完整敲写的。后面通过看书,问同学知道了原因:出现这种异常时一个几率问题,是因为我们的数组长度过于长,JVM分配到的内存不够,就发生了java.lang.OutOfMemoryError。这就是线程存取同一对象相同资源时所引发的竞速情况,就此例而言,ArrayList这样的类不具备线程安全的类。
本周代码托管截图
其他(感悟、思考等,可选)
本周学习了java中的输入与输出,线程与并行API问题,感觉实在很难懂,输入输出问题感觉还勉强可以理解,就是标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。然后线在Java中,“线程”指两件不同的事情1.java.lang.Thread类的一个实例; 2、线程的执行。 使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行着。一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。一旦创建一个新的线程,就产生一个新的调用栈。 线程总体分两类:用户线程和守候线程。 当所有用户线程执行完毕的时候,JVM自动关闭。但是守候线程却不独立于JVM,守候线程一般是由操作系统或者用户自己创建的。这些东西自己也只能看看,根本无法理解其中的内涵,感觉java语言的深度上升了很大一个档次,发这篇博客的时候自己也是很痛苦,因为根本啥也看不懂,只能跟着书上说得的写,自己根本没有一点对这些知识的看法。哎,希望自己能坚持吧!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 2000 行 | 25篇 | 400小时 | |
第一周 | 100/100 | 2/2 | 20/20 | |
第二周 | 100/200 | 2/4 | 20/40 | |
第三周 | 50/250 | 1/5 | 20/60 | |
第四周 | 564/814 | 2/7 | 30/90 | |
第五周 | 623/1437 | 1/8 | 30/120 | 了解到了程序中的异常处理 |
第六周 | 874/2311 | 2/9 | 30/120 | 了解到了java的输入与输出 |