• 20145207《Java程序设计》第6周学习总结


    教材学习内容总结

    一.输入/输出

    InputStreamOutputstream

    串流设计的概念

    从应用程序角度看,将数据从来源取出,可以使用输入串流,将数据写入目的地,可以使用输出串流;在Java中,输入串流代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutputStream实例;

    串流继承框架

    System.in与System.out分别代表标准输入和标准输出;

    可以使用System的setIn()方法指定InputStream实例,用setOut()方法指定printStream;代码如下:

    System.err为printStream实例,称为标准输出串流,用于立即显示错误信息;

    FileInputStream:是InputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来写出数据,主要操作了InputStream的read()抽象方法,从而读取文档中的数据;

    FileOutputStream:是OutputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来写出数据,主要操作了OutputStream中的write抽象方法,使之可写出数据到文档;

    不使用,时都要用close()关闭文档;

    ByteStream是InputStream的子类,可以指定byte数组创建实例,一旦创建就可以将byte数组当做数据源进行读取。ByteArrayOutputStream是OutputStream的子类,可以指定byte数组创建实例,一旦创建就可以将byte数组当做目的地写出数据;

    串流装饰处理器

    若想要为输入输出的数据作加工处理,可以使用打包器类(如:scanner);

    InputStream和OutputStream的一些子类也具有打包器的作用,这些子类创建时,可以接受InputStream和OutputStream实例;

    常用打包器:BufferedInputStream、BufferOutputSream(具备缓冲区作用),DataInputStream、DataOutputStream(具备数据转换处理作用),ObjectInputStream、ObjectOutputStream(具备对象串行化能力)等;

     

    字符处理类

    • Reader与Writer继承架构

    java.io.Reader类:抽象化了字符数据读入的来源;

    java.io.Writer类:抽象化了数据写出目的地;

    FileReader:读取文档并将读到的数据转换成字符;StringWriter:将字符数据写至它最后使用toString()的方法取得字符串;代码如下:

     

    字符处理装饰器

    将字节数据转换成对应的编码字符,可以使用InputStreamReader、OutputStreamWriter对串流数据打包;

    提高字符输入输出效率,提供缓冲区作用:BufferedReader、BufferWriter;

    printWriter:对OutStream打包,对writer打包;

    .线程与并行API

    线程

    线程简介

    单线程程序:启动的程序从main()程序进入点开始至结束只有一个流程;多线程程序:拥有多个流程;

    java中从main()开始的流程会由主线程执行可以创建Thread实例来执行Runable实例定义的run()方法;代码如下:(龟兔赛跑)

     

    • ThreadRunnable

    创建Thread实例就是为JVM加装CPU,启动额外CPU就是调用实例的start()方法,额外CPU的进入点可以定义在Runable接口的run()方法中;

    除了将流程这样定义,另一个撰写多线程程序的方式就就是继承Thread类,重新定义run()方法;

    操作Runnable接口的好处就是较有弹性,你的类还有机会继承其他类;若继承了Thread类,通常是为了直接利用Thread中定义的一些方法;

    线程生命周期

    Daemon线程:如果一个Thread被标示为Deamon线程,在所有的非Deamon线程都结束时,JVM就会自动终止;代码如下:

    Thread基本状态图:可执行、被阻断、执行中;

    线程看起来但事实是同一个时间点上,一个CPU还是只能执行一个线程,只是因其不断切换且很快,所以看起来像是同时执行;

    线程有其优先权,setPriority()方法设定优先权,利用多线程改进效能;

    当线程使用join()加入另一线程时,另一线程会等待被加入的线程工作完毕再继续它的动作;代码如下:

    线程完成run()方法后,就会进入Dead,此时不可以再调用start()方法否则会抛出IlligleThreadException;

    关于ThreadGroup

    每个线程都属于某个线程群组,线程一旦归入某个群组,就无法再更换;可以使用以下程序片段取得当前线程所属线程群组名:Thread.currentThread().getThreadGroup().getname();

    使用uncoughtException()方法处理群组中某个线程出现异常未被捕捉的情况,可以重新定义此方法;

     

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

    p345,有关volatile部分不太清楚。
    解决:package cc.openhome;

    class Variable1 {
        static int i = 0, j = 0;
     
        static void one() {
            i++;
            j++;
        }
     
        static void two() {
            System.out.printf("i = %d, j = %d%n", i, j);
        }
    }
     
    public class Variable1Test {
        public static void main(String[] args) {
            Thread thread1 = new Thread(() -> {
                while (true) {
                    Variable1.one();
               }
                });
        Thread thread2 = new Thread(() -> {
                while (true) {
                    Variable1.two();
                }
            });
        
            thread1.start();
            thread2.start();
        }
    }
  • 相关阅读:
    Linux ansible 常用模块二
    Linux之ansible 常用模块
    flask websocket实现用例
    flask--上下文原理
    python Django
    python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
    并发编程 process 模块的方法及运用 僵尸与孤儿
    python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞
    python 网络编程粘包解决方案2 + ftp上传 + socketserver
    第一节 机器学习基础
  • 原文地址:https://www.cnblogs.com/20145207lza/p/6658254.html
Copyright © 2020-2023  润新知