zoukankan      html  css  js  c++  java
  • 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

    参考资料

  • 相关阅读:
    cocos2dx 动画控制概要
    lua与C交互 具体
    lua与C/C++交互概要
    3D图像算法
    lua 语言笔记
    iostransitiontranslate闪屏问题总结
    document.onreadystatechange()来判断页面加载完
    JavaScript装逼指南
    box-shadow 阴影
    web小技巧
  • 原文地址:https://www.cnblogs.com/20145110tyc/p/5375548.html
Copyright © 2011-2022 走看看