20155216 2016-2017-2 《Java程序设计》第六周学习总结

教材学习内容总结

流与IO

将数据从来源中取出,可以使用输入串流;将数据写入目的地,可以使用输出串流,串流是有向的。

在不使用InputStreamOutputStream时,必须使用close()方法关闭串流。

每次从InputStream读入的数据,都会先置入byte数组中,其中read()方法,每次会尝试读入byte数组长度的数据,并返回实际读入的字节,只要不是-1,就表示读取到数据。可以使用OutputStream的write()方法,指定要写出的byte数组、初始索引与数据长度。

InputStream、OutputStream继承架构



1、标准输入/输出(System.in/System.out)

使用java.util.Scanner操控System.in取得数据。

使用System的setIn()方法指定InputStream实例。

2、FileInputStream与FileOutputStream

使用read()write()可从文档中读取数据,可将数据写出至文档。

不适用时都要使用close()关闭文档。

3、ByteArrayInputStream和ByteArrayOutputStream

可从byte数组中读取数据,可将数据写入byte数组。

4、BufferInputStream和BufferInputStream

在内部提供缓冲区功能。

5、DataInputStream和DataOutputStream

自动在指定的类型与字节间转换。

6、ObjectInputStream和ObjectOutputStream

readObject()将数据读入为对象,writeObject()将对象些写至目的地。

Reader与Writer继承架构

输入/输出装饰器类

1、InputStreamReader与OutputStreamWriter

在建立InputStreamReader与OutputStreamWriter时,可以指定编码,如果没有指定编码,则以JVM启动时所获得的默认编码来做字符转换。

2、BufferedReader与BufferedWriter

提供缓冲区作用,以改进输入/输出的效率。

3、PrintWriter

除了对OutputStream的打包外,PrintWriter还可以对Writer进行打包,提供print()println()format()等方法。

使用多线程进行并发程序设计

创建Thread实例可以执行Runnable实例定义的run()方法。

要启动线程执行指定的流程,必须调用Thread实例的start()方法。

使用Thread.sleep()会让线程进入Blocked状态。

当线程使用join()加入至另一线程时,另一线程会等待被加入的线程工作完毕。

进入Dead(或已经调用过start()的线程)的线程不可以再次调用start()方法。

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

  • 问题1:关于isContinue的使用和多线程的结束缺乏了解。

  • 问题1解决方案:

    如果线程的run()方法中执行的是一个重复执行的循环,您可以提供一个flag来控制循环是否执行,借此让循环有可能终止、线程可以离开 run()方法以终止线程:

public class SomeThread implements Runnable {
private boolean isContinue = true;
public void terminate() {
isContinue = false;
}
public void run() {
while(isContinue) {
// ... some statements
}
}
}

如果线程因为执行sleep()或是wait()而进入Not Runnable状态,而想要停止它,可以使用interrupt(),而程式会丢出InterruptedException例外,因而使得执行绪离开run()方法,例如:

public class SomeThread {
public static void main(String[] args){
Thread thread=new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
System.out.println("go to sleep");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("i am interrupted!");
}
}
});
thread.start();
thread.interrupt();
}
}
  • 问题2:对于java.util.concurrent的概述不够明确。

  • 问题2解决方案:

    接口

    Executor 是一个简单的标准化接口,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。根据所使用的具体 Executor 类的不同,可能在新创建的线程中,现有的任务执行线程中,或者调用 execute() 的线程中执行任务,并且可能顺序或并发执行。ExecutorService 提供了多个完整的异步任务执行框架。ExecutorService 管理任务的排队和安排,并允许受控制的关闭。ScheduledExecutorService 子接口添加了对延迟的和定期任务执行的支持。ExecutorService 提供了安排异步执行的方法,可执行由 Callable 表示的任何函数,结果类似于 Runnable。Future 返回函数的结果,允许确定执行是否完成,并提供取消执行的方法。

队列

java.util.concurrent ConcurrentLinkedQueue 类提供了高效的、可伸缩的、线程安全的非阻塞 FIFO 队列。java.util.concurrent 中的五个实现都支持扩展的 BlockingQueue 接口,该接口定义了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。这些不同的类覆盖了生产者-使用者、消息传递、并行任务执行和相关并发设计的大多数常见使用的上下文。

计时

TimeUnit 类为指定和控制基于超时的操作提供了多重粒度(包括纳秒级)。该包中的大多数类除了包含不确定的等待之外,还包含基于超时的操作。在使用超时的所有情况中,超时指定了在表明已超时前该方法应该等待的最少时间。在超时发生后,实现会“尽力”检测超时。但是,在检测超时与超时之后再次实际执行线程之间可能要经过不确定的时间。

同步器

四个类可协助实现常见的专用同步语句。Semaphore 是一个经典的并发工具。CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。Exchanger 允许两个线程在集合点交换对象,它在多流水线设计中是有用的。

并发 Collection

除队列外,此包还提供了几个设计用于多线程上下文中的 Collection 实现:ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet。

  • 问题3:ReadWriteLock的使用

  • 问题3解决方案:

    Lock,作用于synchronized修饰符相同,都是确保作用范围的代码在执行时其他线程不能进入。读写锁ReadWriteLock拥有更加强大的功能,它可以细分为读锁和谢锁。

    读锁可以允许多个进行读操作的线程同时进入,但不允许写进程进入;

    写锁只允许一个写进程进入,在这期间任何进程都不能再进入。

代码调试中的问题和解决过程

  • 问题1:

  • 问题1解决方案:

    尚未解决...

代码托管

上周考试错题总结

  • 错题1及原因,理解情况

    创建一个只能存放String的泛型ArrayList的语句是ArrayList<String>al=new ArrayList<String>()

  • 错题2及原因,理解情况

    泛型的优点是不用向下强制类型转换,类型安全。

  • 错题3及原因,理解情况

    1.  class Propeller2  {
2. pulolic static void main (String[]args)//add code here?
3. { new Propeller2().topGo(); }
4.
5.void topGo() //add code here?
6. { middleGo(); }
7.
8.void middleGo() //add code here?
9. { go(); System.out.println ("late middle"); }
10.
11. void go() //add code here?
12. {throw new Exception(); }
13. }

在第2行、第5行、第8行和第11行加入声明throws Exception。

  • 错题4及原因,理解情况

    假设有自定义异常类ServiceException,那么抛出该异常的语句正确的是throw new ServiceException()

  • 错题5及原因,理解情况

   1.   class  Parser extends  Utilis  {
2. public static void main (String [] args) {
3 . try { System. out.print (new Parser ( ) .getlnt ("42")) ;
4. } catch (NumberFormatException n) {
5 . System.out .println ( "NFExc" ) ; }
6. }
7. int getlnt (String arg) throws NumberFormatException{
8. return Integer.parselnt (arg) ;
9. }
10. }
11. class Utils {
12. int getlnt (String arg) { return 42; }
13. }

运行结果为42.

结对及互评

评分标准

  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

  • 参考示例

点评过的同学博客和代码

  • 本周结对学习情况

    • 20155238

    • 结对照片

    • 结对学习内容

      -理论知识

      1、输入/输出及其架构(InputStream & OutputStream和Reader & Writer)。

      2、多线程进行并发程序理解。

      -课本编程实例

      1、编写课本中所有串流输入、输出程序。

      2、编写课本中多线程程序,了解线程的开始、等待和结束过程。

      3、针对线程群组、和ReadWriteLock以及Lock进行研究和资料查找。

  • 上周博客互评情况

其他(感悟、思考等,可选)

1、了解了CPU只能一次执行一个线程,多个线程执行是通过CPU的高速切换完成。

2、java的输入/输出方法灵活多样,熟练使用输入和输出可时程序变得更加精炼和完善。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 6/6 1/4 20/20
第二周 334/340 1/5 18/38
第三周 570/900 1/6 22/60
第四周 544/1358 1/7 30/90
第五周 731/2089 1/8 30/90 了解了java中的架构,排序,以及异常处理
第六周 945/3017 1/9 30/90 学习输入输出以及多线程程序设计

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:25小时

  • 实际学习时间:30小时

  • 改进情况:

(有空多看看现代软件工程 课件

软件工程师能力自我评价表
)

参考资料

20155216 2016-2017-2 《Java程序设计》第六周学习总结的更多相关文章

  1. 20155216 2016-2017-2 《Java程序设计》第九周学习总结

    20155216 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC架构 JDBC API的使用 JDBC连接数据库 1.导入JDBC包: 添加impo ...

  2. 20155227 2016-2017-2 《Java程序设计》第九周学习总结

    20155227 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联 ...

  3. 20155328 2016-2017-2 《Java程序设计》第九周学习总结

    20155328 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 16.1 JDBC入门 JDBC是Java联机数据库的标准规范,定义一组标准类与接口,应用程 ...

  4. 20155320 2016-2017-2《Java程序设计》第九周学习总结

    20155320 2016-2017-2<Java程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...

  5. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  6. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  7. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  8. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  9. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  10. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

随机推荐

  1. nginx 无法访问root权限的文件内容

    问题: 按照的nginx,nginx配置的user  是 nginx,nginx 是root用户启动的.  文件夹A放的那啥是root用户上传的文件. 可 nginx 无法访问 到  文件. 方法: ...

  2. sql计算总页数

    1 计算总页数方法: public int getTotalCount() {        Statement stmt = null;    //提交SQL语句对象stmt        Resu ...

  3. urllib 和urllib2 模块使用简例

    一.最简单的使用 import urllib,urllib2 response = urllib2.urlopen("https://www.baidu.com") print r ...

  4. java学习笔记----@Override的作用

    初学java或多或少都会有这样的疑问,@Override有什么用,有的时候写,有的时候又不写,搞的初学者甚是郁闷. 做了一两年的开发说起这个问题不一定能够对答如流.小弟才疏学浅,花了点时间,看了一下资 ...

  5. 把Excel导入SQL server时出现错误

    在把Excel导入SQL server时出现“未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 ”该 错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12 ...

  6. Poor Warehouse Keeper

    Poor Warehouse Keeper http://acm.hdu.edu.cn/showproblem.php?pid=4803 Jenny is a warehouse keeper. He ...

  7. 【校招面试 之 剑指offer】第10-3题 矩阵覆盖问题

    题目:我们可以使用2✖️1的小矩形横着或者竖着去覆盖更大的矩形.请问用8个2✖️1的小矩形无重叠地覆盖一个2✖️8的大矩形,共有多少种方法? 分析:当放第一块时(假定从左边开始)可以横着放,也可以竖着 ...

  8. [leetcode]215. Kth Largest Element in an Array 数组中第k大的元素

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  9. ecplice中代码使用快捷键无法格式化,使用其他方法将代码格式化的步骤

    选中需要进行格式化的代码--->右键--->source--->format,就可以将代码格式化了.

  10. ServiceStack支持跨域提交

    //ServiceStack对浏览器有一定的限制 //修改AppHost.cs文件 using Funq;using ServiceStack;using ServiceStackTest.Servi ...