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

学号 《Java程序设计》第X周学习总结

教材学习内容总结

10 输入/输出

10.1 InputStream与OutputStream

  • Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象。
  • FileIntputStream是InputStream的子类,用于衔接文档以读入数据,FileOutStream是OutputStream的子类,用于衔接文档以写出数据。
  • 在不使用InputStream与OutputStream时,必须使用close()方法关闭串流。由于InputStream与OutputStrem操作了java.io.Closeable接口,其父接口为java.lang.AutoCloseable接口。

10.1.2

1.标准输入/输出

  • 可以使用System的setIn()方法指定InputStream实例,重新指定标准输入来源。

2.FileInputStream与FileOutputStream

10.2字符处理类

  • 针对字符数据的读取,Java SE提供了java.io.Reader类,其抽象化了字符数据读入的来源。
  • 针对字符数据的写入,则提供了java.io.Writer类。其抽象化了数据写出的目的地。
  • 在启动JVM时,可以指定-Dfile.encoding来指定FileReader、FileWriter所使用的编码。
import java.io.IOException;
import static java.lang.System.out;

public class MemberDemo {
    public static void main(String[] args) throws IOException {
        Member[] members = {
                    new Member("B1234", "Justin", 90), 
                    new Member("B5678", "Monica", 95), 
                    new Member("B9876", "Irene", 88)
        };
        for(Member member : members) {
            member.save();
        }
        out.println(Member.load("B1234"));
        out.println(Member.load("B5678"));
        out.println(Member.load("B9876"));
    }
}

运行结果:

10.2.2字符处理装饰器

在Java中,对串流可以有装饰器,那么对字符串也有装饰器书中介绍了InputStreamREader与OutputStreamWriter,BufferedReader与BufferedWriter和PrintWriter这三种打包器。
1.InputStreamREader与OutputStreamWriter:
在建立InputStreamREader与OutputStreamWriter时可以指定编码,对字节数据转化为相应的编码字符。
2.BufferedReader与BufferedWriter:
BufferedReader与BufferedWriter可以将转换后的数据做缓冲处理,以增加读取效率。
3.PrintWriter:
PrintWriter与PrintStreame十分相似既可以对OutputStream打包,也可以对Writer打包。

11 线程与并行API

11.1 线程

在java中,如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run()方法中。

package Thread;

import static java.lang.System.out;

public class TortoiseHareRace {
    public static void main(String[] args) {
        boolean[] flags = {true, false};
        int totalStep = 10;
        int tortoiseStep = 0;
        int hareStep = 0;
        out.println("龟兔赛跑开始...");
        while(tortoiseStep < totalStep && hareStep < totalStep) {
            tortoiseStep++;
            out.printf("乌龟跑了 %d 步...%n", tortoiseStep);
            boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
            if(isHareSleep) {
                out.println("兔子睡着了zzzz");
            } else {
                hareStep += 2;
                out.printf("兔子跑了 %d 步...%n", hareStep);
            }
        }
    }
}

它只有一个流程,它的循环控制为乌龟或兔子走完十步,比赛结束。按照程序由上而下的运行原则,每次都是乌龟先递增步数,然后再是兔子随机睡觉或走两步,两者好像并不是同步的,这样对兔子来说并不公平,所以,为了设计一个更加公平的比赛程序,我们希望两者可以不受程序运行过程中先后运行顺序的干扰,同时进行步数的移动。这里就用到了书中介绍到的多线程运行程序。

package Thread;

import static java.lang.System.out;

public class TortoiseHareRace {
    public static void main(String[] args) {
        boolean[] flags = {true, false};
        int totalStep = 10;
        int tortoiseStep = 0;
        int hareStep = 0;
        out.println("龟兔赛跑开始...");
        while(tortoiseStep < totalStep && hareStep < totalStep) {
            tortoiseStep++;
            out.printf("乌龟跑了 %d 步...%n", tortoiseStep);
            boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
            if(isHareSleep) {
                out.println("兔子睡着了zzzz");
            } else {
                hareStep += 2;
                out.printf("兔子跑了 %d 步...%n", hareStep);
            }
        }
    }
}

11.1.4关于ThreadGroup

  • ThreadGroup的某些方法,可以对群组中所有线程产生作用。interrupt()方法可以中断群组中所有线程,setMaxPriority()方法可以设定群组中所有线程最大优先权。activeCount()方法获取群组的线程数量 。
  • 未捕捉异常会由线程实例setUncaughtExceptionHandler()设定的Thread.UncaughtExceptionHandler实例处理之后是线程ThreadGroup,然后是默认的Thread.UncaughtExceptionHandler。

11.2并行API

11.2.1Lock、ReadWriteLock与Condition

1.使用Lock

  • lock接口主要操作类之一为ReentrantLock,可以达到synchronized的作用。
  • Lock接口还定义了tryLock()方法,如果线程调用tryLock()可以取得锁定会返回true,若无法取得锁定并不会发生阻断,而是返回false。

4.使用Condition

Condition接口用来搭配Lock,最基本用法就是达到Object的wait()、notify()、notifyAll()方法的作用。

class Resource {
    private String name;
    private int resource;

    Resource(String name, int resource) {
        this.name = name;
        this.resource = resource;
    }

    String getName() {
        return name;
    }

    synchronized int doSome() {
        return ++resource;
    }

    synchronized void cooperate(Resource resource) {
        resource.doSome();
        System.out.printf("%s 整合 %s 的资源%n",
                this.name, resource.getName());
    }
}

public class DeadLockDemo {
    public static void main(String[] args) {
        Resource resource1 = new Resource("resource1", 10);
        Resource resource2 = new Resource("resource2", 20);
        
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                resource1.cooperate(resource2);
            }
        });
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                resource2.cooperate(resource1);
            }
        });

        thread1.start();
        thread2.start();
    }
}

本周代码托管截图

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 1/2 20/20
第二周 300/500 1/3 18/38
第三周 500/1000 1/4 22/60
第四周 300/1300 1/5 30/90
第五周 300/1600 1/6 30/160
第六周 700/2300 2/7 30/190

参考资料

原文地址:https://www.cnblogs.com/20145110tyc/p/5375548.html