zoukankan      html  css  js  c++  java
  • 20145319 第六周学习总结

    20145319 《Java程序设计》第六周学习总结

    教材学习内容总结

    本周学习教材的第十、十一章,主要讲述了串流,字符处理和线程以及并行API

    1. 输入输出

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

    2. 串流的继承结构:

    • 标准输入和输出: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,装饰器就是这些对数据进行了一些加工处理,例如缓冲、串行化、数据装换等
    • BufferInputStreamBufferOutputStream:将数据尽量地读取足够数据至内存的缓冲区,减少从来源直接读取数据的次数,从而提高效率(访问内存的速度较快)
    • DataInputStreamDataOutputStream:提供读取写入java基本类型的方法,这些方法会自动在指定的类型和字节中转换

    2. 线程

    之前学习的各种实例都是单线程的,即程序从main()进入后只有一个流程,但是在设计时候可以根据需要拥有多个流程,就是多线程(Multi-thread)程序

    1. Thread和Runable:
    • JVM即一台虚拟机,只有主线程的CPU,如果想增加CPU就得创建thread实例,CPU执行的进入点,定义在Runnable的run()方法中
    • 撰写多线程程序可以操作Runnable接口,也可以继承Thread类,重新定义run()方法,但操作Runnable接口会使得程序更富弹性

          2.  线程生命周期

    •  Daemon线程:在所有的非Daemon线程结束时,JVM就会自动终止
    •  基本状态图:start—>runnable—>(blocked)—>running—>dead , Thread.sleep()、wait()阻断、输入输出完成等都会让线程进入blocked状态,当某线程进入Blocked,最好让另一线程进入running状态,避免cpu空闲下来,是改进效能的方式之一。 
    • join():安插线程,在A执行的时候插入B,等B完成后在进行A(可以指join()的时间,如join(1000)即为加入线程最多执行1000毫秒)

          3.  等待和通知

    • wait():指定等待排班时间
    • notify():通知加入排班
    • notifyall():锁定竞争,通知所有等待中的线程参与排班

          4.  并行API

    • Lock、ReadWriteLock和Condition:提供类似synchronized、wait()、notify()、notifyall()的作用以及更多高级功能
    • Executor :Executor接口可以将Runnable的指定与实际如何执行分离
    • Future与Callable搭配使用

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

    chapter10:AC BD AC BD A BC BD BD D ABD  
    chapter11:A C B AB AB D B A B CD 

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

    最近在学习新内容的回过头打算把前几章的课后操作题写一写,本以为会比较轻松,但操作起来没有意料中那样简单。

    代码(汉诺塔):

     

    这段程序看上去没有什么问题,但是在其中有一些问题

    首先我们要了解程序到底出现了什么问题,java.lang.StackOverflowError其实说的就是这个程序出现了栈溢出,所以导致程序无法正常运行

    那什么是栈溢出?什么又会导致栈溢出呢?

    我们都知道缓冲区的数据不得大于缓冲区的大小,而栈溢出就是指这个数据足够大的时候,溢出缓冲区的范围。

    而导致栈溢出一般会有两种情况,一是变量体积太大,例如在写程序时定义变量 int abc[]=new int[2*1024*1024]

    第二个就是上程序出现的问题了: 函数调用层次过深,每调用一次,函数的参数、局部变量等信息就压一次栈

    在move函数循环调用自身时,num--;……move(mid, from, to, num-1);这里在函数中又使用num-1就导致了函数将一直循环,将其修改成move(mid, from ,to,num)即可

     汉诺塔运行成功

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

    • 在回过头看以前的操作题时候,发现很多操作题的思路数据结构和算法教材上都有,感觉先弄懂算法再编程效果会好很多

    学习进度条

    代码行数(新增/累积)

    博客量(新增/累积)

    学习时间(新增/累积)

    重要成长

    目标

    3500行

    28篇

    300小时

    第五周

    200/1200

    1/5

    20/105

    第六周

    300/1500

    2/7

    25/130

    第七周

    第八周

     

     

    参考资料

  • 相关阅读:
    HDU 1525
    kmp模板
    hdu 4616 Game(树形DP)
    hdu 4619 Warm up 2(并查集活用)
    hdu 4614 Vases and Flowers(线段树加二分查找)
    Codeforces 400D Dima and Bacteria(并查集最短路)
    poj 2823 Sliding Window (单调队列)
    hdu 2196 Computer(树形dp)
    hdu 4604 Deque
    最短路径
  • 原文地址:https://www.cnblogs.com/20145319zk/p/5374499.html
Copyright © 2011-2022 走看看