1. 其他流 - 打印流 - PrintStream

        本身是一个字节流  是一个装饰者  

 

1.1 打印流的优点:

  1.更多的类型的输出方法

  2.自动刷新流

  3.永远不抛出IOException

 

2. 其他流 - 打印流 - PrintWriter

       跟PrintStream类似

 

3. 其他流 - Java属性对象 - Properties

    (单独的一个工具,只是用到流里面的一些知识。)

    在 java.util包下有一个工具类Properties,可以用作java常用的配置对象来使用,可以在其中保存键值对的类型,而且此对象可以在流中构建,也可以写到

    从继承结构上来看,Properties 来自于集合类中的 HashTable,所以本身也可以存储键值对类型的数据。

 

3.1 properties文件

    java属性文件,通常用作java的配置文件来使用

    文件格式:

                    一行一个键值对

                    键和值之间用等号相连

                    通常其中不可以包含非 ISO8859-1 的字符  如果遇到非 ISO8859-1需要使用\转义 \u5F02:unicode编码

4. 序列化流

    java是面向对象的语言,对象是存活在虚拟机的内存中,是动态灵活可变的数据。

 

4.1 序列化、反序列化主要的目的:

    将对象序列化后保存到磁盘中,这个过程称之为将对象持久化,而将持久化的对象信息再读取回内存恢复为对象的过程,称之为反持久化。

 

4.2 serializable接口:

    想要实现序列化的接口

    没有任何要求实现的方法,此接口为一个标记接口,功能仅仅是用来声明当前类可以被序列化

 

4.3 java实现序列化/反序列化:

 

4.4 序列化中的 serialVersionUID:

    在序列化/反序列化中唯一的标识这个类,与当前类的属性紧密相关,所以不同的类的serialVersionUID是不同的。

    serialVersionUID 在需要的时候,可以自己指定,在当前的类中,通过静态的名为 serialVersionUID 属性指定(在网络传递对象时,在机器两端手动指定这个值相同,反序列化时就不会报错了!!值不同是为了保证类型转换时的安全性)

 

4.5 Transient 关键字

        实现了Serializable接口的类的属性上通过transient关键字来申明该属性不能被序列化。(某些比较重要的信息)实现在序列化时堆属性的隐藏。

        另外,静态的属性也不会被序列化,

        另外,集合类型也不会被序列化

        另外,类的属性如果是一个非基本类型

 

 

案例:实现将对象序列化/反序列化

 

5. 多线程

    5.1 进程和线程

        a.进程

            所谓的进程其实就是一个程序或服务(没有界面的程序,功能是背后提供一系列的支持,360 加速的原理就是将某些服务的启动改一下,如不能关闭,就转到进程直接关闭),操作系统中一个独立运行的程序或服务就是一个进程

        b.多进程

        c.线程

        d.多线程

        **计算机中只有一个cpu,实际上同一个时刻,只能处理一个运算,但是由于cpu的运算速度非常的快,通过不停的切换处理的任务,从而使多个进程多个线程一次都能得到处理,处理的很快,切换的也很快,人看来似乎这些进程和线程同时进行(CPU 的发展:286  386  586(不让用了) 奔腾(单核),酷睿(四核、八核)在处理多线程时可以做好多的事)

 

        **JVM也是一个进程,可以在其中开辟多个线程执行并发的任务,这样的开发多个线程的技术成为java多线程技术。

 

5.2 Java中的多线程

  5.2.1Thread 类

          java是面向对象的语言,万物皆对象。在java中也是用对象来代表底层的物理线程,来方便我们操作。这样的线程对象归属于Thread类。

 

  5.2.2 启动线程的过程:

      a.启动线程的方式一:

            

      b.启动线程的方式二:

 

5.3 两种线程启动方式的比较:

    java是单继承,继承的方式创建线程,将会占用extends关键字

    java是多实现的,实现接口的数量没有限制,

 

5.4 关闭线程:

        stop,已过时,不安全,现在已经都不用了。

        后面也没有提供任何类似的方法了,就给程序了一个开关,通常是boolean类型的。

      

 

5.5 线程并发的细节:

**主线程和其它线程没有什么特殊的地方,只是程序的入口。

**多个线程的并发过程中,在无序地、不停地争夺CPU,由于CPU运行地非常快,看起来似乎这些线程在并发的执行。

**只要进程活着,线程就活着。

 

5.6 线程的优先级:

 

5.7 多线程并发安全问题: 

        多个线程的执行顺序不确定,操作共享资源时,就有可能因为线程的无需执行,产生以写以外的情况。安全性!!(打印机中,如果有十个人都来争夺这个资源,产生多线程并发问题,就会这里打印一点,那里打印一点)

多线程并发安全问题产生的条件:

a.有共享资源

b.有线程并发操作了共享资源

c.有线程并发操作了共享资源且涉及到了修改操作

 

 

5.8 解决多线程并发安全问题:

    破坏产生多线程并发问题的条件

    禁止共享资源 -- 有些情况下是可以的  例如买火车票的例子  --- ThreadLocal

    禁止多线程并发操作 ---Syncronized代码块

    禁止修改 --- ReadWriteLock

 

5.9 Syncronized 代码块的使用:

    原理:

            锁对象可以任意的选择,但是要保证并发的线程操作的都是同一个锁对象。

    语法:

            syncronized(锁对象){要同步的代码}