您的位置:首页 > 职场人生

黑马程序员——第十四篇: 打印流、随机读写、对象序列化、多线程

2015-12-16 15:37 411 查看


  ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a

  href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

1.打印流
 非常常见的一种流对象,应用场景最多,简单
 Hello World System.out.println()
使用就是打印流对象
 System.out
运行结果就是 PrintStream对象,打印流方法println()实现输出
 
 PrintStream PrintWriter
 
 1:
打印流特性
   为其他输出流添加功能,输出,也属于装饰类
   不操作数据源,只操作数据目的
   打印流永远不会抛出IOException,不等于不抛别的异常
   打印流可以启用自动刷新功能
 
   想输出数据,优先考虑使用打印流
   PrintStream PrintWriter
方法是一样的 print println
 
 2: PrintStream
字节流,打印流
   打印的数据目的,全部写在构造方法中
   构造方法中可以接收的数据目的
     File
、OutputStream、String
 
 3. PrintWriter
字符流,打印流
   打印的数据目的,全部写在构造方法中
   构造方法中可以接收的数据目的
    File
、OutputStream、String、Writer
 
 4.
打印流输出数据
   演示不同数据目的
File OutputStream String Writer
程序Demo:









 

2.标准输入流标准输出

 1:标准输入流 System.in
   public static final InputStream in = BufferedInputStream
   使用InputStream方法read读取键盘



 2:标准输出流 System.out
  public static final PrintStream out 
System.out
  out运算结果是打印流对象,继承OutputStream
  使用OutputStream类方法write写数据



3.对象的序列化

    对象中的数据,从内存中,使用流对象存储到文件中,对象的序列化
    就是写对象,写文件中保存
 
    反序列化:使用流从文件中读取对象
 
  1. ObjectOutputStream
序列化流,写对象
    ObjectOutputStream继承OutputStream,字节输出流
    构造方法:
      ObjectOutputStream(OutputStream out)
      传递字节输出流.FileOutputStream(文件)
 
   写对象的方法 void
writeObject(Object o)将对象写入到传递字节流中
  


  2. ObjectInputStream
反序列化流,读取对象
 
    ObjectInputStream继承InputStream,字节输入流
    构造方法:
      ObjectInputStream(InputStream in)
      传递字节输入流
FileInputStream(文件)
 
    读取对象的方法  Object
readObject();



  3.
序列化问题
    static
不能序列化
    对象序列化,static属于自己的类,不属于对象
    因此静态不能序列化
 
    个关键字 transient
    单一,只能修饰成员变量
    阻止变量序列化

4. Serializable接口

  Person类实现Serializable接口,没有做任何方法的重写,编译和运行
  Serializable没有方法
 
  作用:标记型接口,为实现类做一个标记
  JVM见到这个标记后,就可以对类进行序列化
 
  就是为了序列化,和其他的运行,编译,无关

5.序列号问题

 先将Person对象,进行了一次序列化动作
 修改了Person类的源代码,从新编译成了class文件
 没有再次写对象,直接就进行读取了对象,抛出了异常
  cn.itcast.iostream.Person; local class incompatible: stream classdesc serialVersionUID
= -5075003414356443568, local class serialVersionUID = 4022578570691496470
 
 序列化文件person.txt记录序列号,和class文件中的序列化不同
 
 Person类编译后,生成新的class文件,文件中根据类中的成员定义,计算一个序列号
 普通的十进制long型整数
 对Person的对象,进了序列化,序列化文件中(person.txt)和class文件中的序列好是一样的
 
 修改了Person类源代码后,从新编译生成class文件,从新计算一个序列号
 此时class文件中的序列化,就已经和person.txt文件中的序列化不同
 
 直接做了反序列化,出现了异常
 
 如果序列化成功,即使修改了源代码,也能直接反序列
 
 修改源代码后,编译生成class文件,如果能不从新计算序列号
 
 在类中,自己给你自己的类写一个序列号,序列化就终身不变
 
 Person定义对象全部必要代码已经OK
   成员变量,构造方法,get
set toString
   存储哈希表,hashCode
equals
   存储红黑树 compareTo
   被序列化 序列号
 8种基本类型保证类,String类
程序Demo:实现Serializable接口的学生类



6.进程

 进程,正在运行的程序
 正在运行的程序,所占有的系统资源(内存)空间

7.线程

 线程是运行程序中的线程
 就是一个对于CPU的独立运行程序路径
 线程,就是个独立执行路径,会被CPU单独执行
 
 Java第一种实现线程方式
 java.lang.Thread类,描述线程对象的类
 定义类继承Thread
 重写父类的run方法public
void run()
 创建Thread子类对象
 子类对象调用父类(Thread)start()开启线程
 
  为什么要重写run()方法
    Java工程师(Sun)设计线程程序的时候,会不会知道
    其他程序员,用线程运行什么代码
  标准:无论日后用线程运行什么代码,全部放在run中
 
  启动线程使用的是那个方法:start()
 
  线程能不能多次启动:不能
 
  run()和start()方法的区别
    run就是一个普通方法,封装了线程运行的代码
    start()开启线程(执行路径),让JVM,运行run
程序Demo:



8.获取和设置线程的名字

 1.
如何获取线程名字-适用于Thread子类
   猜,线程对象类Thread
   方法 String
getName()
 
 2.
在不是Thread类子类中获取名字
   Thread类中静态方法 currentThread()
   哪里使用了这个方法,哪里就叫当前 
   Thread currentThread()
返回正在执行的线程对象
   这个方法写在哪里,返回的就是哪里的线程对象
   返回Thread类对象,调用方法getName
 
 3.
设置线程名字
   猜, Thread类方法
setName(String name)
 
   Thread类构造器
Thread(String name)

9.线程优先级

 优先级高的线程,占有的CPU时间相对长一些
 优先级低的线程,占有的CPU时间相对短一些'
 
 优先级有10个级别
1-10
 不对线程进行任何优先级的设置,默认都是5
 
 1.
获取优先级的方法
   int getPriority()

 2.
设置优先级的方法
   void setPriority(int i) 
1-10

10.线程控制方法

 1. static void sleep(long m)
  让指定线程,在指定的毫秒值内,休眠,不运行
  sleep写在哪个线程中,哪个线程就会休眠
 
 2. void join()
   等待执行join方法的线程终止
   如果该线程执行了join,他不结束,其他线程不能执行
 
 3. static void yield()
   线程的让步
   yield方法写在哪个线程中,哪个线程就会主动让出自己的CPU资源
 
 4. void setDaemon(boolean on)
   参数值是true,线程变成守护线程
   运行的程序中全部是守护线程的时候,JVM就会结束

11.多线程售票案例

 电影院总票数 100张
 3个售票窗口,线程技术模拟功能
 3个窗口,3个执行路径,3个线程
 每个线程调用自己的run,
100数据方法的贡献
 100张票变量,定义成员位置
 

12.实现线程程序第二种方式 实现接口

 实现步骤:
   定义类实现java.lang.Runnable接口
   重写接口方法run
   创建Thread类对象,传递Runnable接口实现类对象
   调用Thread类方法start()开启线程
 
 线程实现方式,继承Thread,实现Runnable
 区别
   单继承,继承Thread类方式
   多实现,避免单继承的局限性
 
   继承方式,数据是线程对象特有数据
   实现方式,数据是线程对象共享数据
 

13.多线程程序数据安全分析

 3个线程,同时进行售票操作-多线程同时操作同一个共享数据
 线程将有严重的安全隐患
 
 线程安全问题,一旦发生,开发人员,首要责任人
 
 让线程进行休眠,模拟出线程卡机线程,主动放弃执行权
 CPU就有可能执行其他线程



14. Java中如何解决线程安全问题

 技术,同步技术,使用同步技术,保证线程的安全
 
 关键字 synchronized
 格式:同步代码块
 
   synchronized(任意对象){
      线程操作的共享数据
   }
 
 同步技术,程序安全,但是牺牲了速度
 
 必须保证安全
 
 同步技术原理
   synchronized(任意对象)
   同步中的对象,专业名词对象的监视器
   通俗的语言,锁
 
 线程在运行到同步代码块的时候,首先判断还有没有锁
 如果有锁,线程就要获取锁,进入同步中运行,没有运行完成,没有出同步,
 锁就依然属于这个线程
 其他线程由于没有锁,不能执行,被阻挡同步以为
 如果线程运行完毕了,出去同步,将锁进行释放
 对于锁的操作,比较消耗资源,安全程序速度慢
程序Demo:



15.线程的死锁程序

 多线程在同时抢夺同一个对象锁
 产生多线程相互等待的程序假死现象
 
 注意:线程进入同步,必须获取对象锁
 出去同步释放对象锁,如果进入同步,不出去,锁不释放。
程序Demo:





 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: