IO流-线程

上传人:206****923 文档编号:56865672 上传时间:2018-10-16 格式:PPTX 页数:29 大小:607.40KB
返回 下载 相关 举报
IO流-线程_第1页
第1页 / 共29页
IO流-线程_第2页
第2页 / 共29页
IO流-线程_第3页
第3页 / 共29页
IO流-线程_第4页
第4页 / 共29页
IO流-线程_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《IO流-线程》由会员分享,可在线阅读,更多相关《IO流-线程(29页珍藏版)》请在金锄头文库上搜索。

1、,将Object转换为byte序列,就是序列化,反之叫反序列化,主题,对象的序列化 Java 多线程编程,NO.1,对象的序列化,定义:将Object转换为byte序列,就是序列化,反之叫反序列化为什么要序列化: 为了在byte流中存储对象,NO.1,对象的序列化,1. 如何序列化: 使用writeObject(Object)/readObject()1) 序列化流, 是过滤流ObjectOutputStream writeObject(Object) 序列化对象ObjectInputStream readObject() 对象的反序列化2) 序列化接口: 一个类实现了序列化接口, Java会

2、自动的提供对这个类实例的 IO支持代码, 这个接口中没有声明直接的方法对象必须实现“序列化接口“才能进行 “序列化“否则出现不能序列化的异常!3) JavaBean 规范, 必须实现Serializable接口Java API中的类大多是Java Bean, 基本都实现了Serializable,2 浅层复制与深层复制1) Java的默认复制规则是浅层复制, 性能好, 隔离性差浅层复制现象, 只复制第一层对象2) 利用序列化实现深层复制,/* 利用对象的序列化和反序列化实现对象的深层复制. */public static Object deepCopy(Object obj)try/1 对象的

3、序列化ByteArrayOutputStream buf =new ByteArrayOutputStream();ObjectOutputStream out = new ObjectOutputStream(buf);out.writeObject(obj);out.close();/2 对象的反序列化byte data= buf.toByteArray(); ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data);Object o = ois.readObject();/从data进行反序列化

4、in.close();return o;catch(Exception e)throw new RuntimeException(e);,NO.2,Java IO总结,1)是一种数据操作模型: 把任何数据都作为Byte的有序集合看待逐一处理的方式方式叫做流.Java 流模型, 是byte by byte 是数据集合data : 41 42 00 00 ff ff d6 d0 index : 0 1 2 3 4 5 6 7 8pointer: RandomAccessFile 只能操作文件, 只能处理基本类型,节点流: 流开始和结束的地方过滤器: 基本流的功能扩展字节流: 每次处理一个byte字

5、符流: 每次出来一个char,字节流: 1)InputStream 最基本的输入流操作模型, 是抽象类(read()是没有实现的)|- FileInputStream 实现了在文件上读取的方法 read(), 节点流|- ByteArrayInputStream 实现了在数组里读取的方法 read() ByteArrayInputStream in = new ByteArrayInputStream(byte buf);|- FilterInputStream 过滤流,包装在一个基本流外部,提供功能扩展| |- DataInputStream 为基本流扩展了基本数据类型读取| | readI

6、nt() readDouble().方法的底层是read()| |- BufferedInputStream 为基本流提供缓冲处理| |- CipherInputStream 解密输入流, 知道就行| |- ZipInputStream 解压输入流, 知道就行|- ObjectInputStream 对象输入流, 也是过滤器,OutputStream 最基本的输出流操作模型,是抽象类(write()是没有实现的)* |- FileOutputStream 实现了在文件上写出的方法 write(), 节点流|- ByteArrayOutputStream 在变长数组上实现了write() 方法b

7、yte toByteArray() 创建一个新分配的 byte 数组。 |- FilterOutputStream * | |- DataOutputStream 基本类型输出| | * | |- BufferedOutputStream 缓冲输出| |- CipherOutputStream 加密输出| |- ZipOutputStream 压缩输出|- ObjectOutputStream 对象输出流,2)字符流, 每次处理一个字符Reader 抽象类, 定义了抽象方法read(), 每次读取一个字符* |- InputStreamReader 也是过滤器, 将byte序列解码为char序

8、列| 底层也是依赖基本的byte输入流* |- BufferedReader (Scanner) 是字符流过滤器,| 有常用的文本读取方法readLine() |- FileReader 底层是 FileInputSream + InputStreamReader| 不能指定读取文件的字符编码,Writer 抽象类, 定义抽象方法write() 每次写出一个字符* |- OutputStreamWriter 也是过滤器, 将char序列编码为byte序列| 底层也是依赖基本的byte输出流* |- PrintWriter 是过滤器, 提供了常用方法println()| 非常常见的文本处理方法|

9、- FileWriter = OutputStreamWriter + FileOutputStream| 不能指定文本输出编码, 不好用!,NO.3,重点:Java 多线程编程,1) 程序: 指令+数据的byte序列, 如: qq.exe2) 进程: 正在运行的程序, 是程序动态的执行过程(运行于主存储器)3) 线程: 在进程内部, 并发运程的过程(方法)线程是一个操作系统创建并维护的一个资源,对操作系统来说JVM就是一个进程。对于单个CPU系统来说,某一个时刻只可能由一个线程在运行。一个Thread对象就表示一个线程。,线程由三部分组成:(1).CPU分配给线程的时间片(2).线程代码(写

10、在run方法中)(3).线程数据进程是独立的数据空间,线程是共享的数据空间.线程对象存在于虚拟机进程空间的一块连续的地址空间(静态)/main()也是一个线程。 注意: 1.线程是动态的,与线程对象是两回事.2.线程对象与其他对象不同的是线程对象能够到底层去申请管理一个线程资源。3.只有对线程对象调用start()方法才是到底层去申请管理一个线程资源。4.任务并发执行是一个宏观概念,微观上是串行的。,4) 并发: 进程是并发运行的, OS将时间划分为很多时间片段, 尽可能均匀分配给正在运行的程序, 微观上进程走走停停, 宏观上都在运 行这种都运行的现象叫: 并发, 但是不是绝对意义上的“同时“

11、 了解: 单核CPU电脑同一时间内只能执行一个线程,这句话是对的,首先了解一下,CPU执行的过程 ,它是把时间分成若干个小时间段,这些时间段很小的,系统中有很多进程,每个进程中又包含很多线程,在同一 时间段 内,电脑CPU只能处理一个线程,NO.3,重点:Java 多线程编程,一、重点:Java 创建一个线程1 Thread 类:线程包含一个可以运行的过程(方法) Thread 类中包含方法 run 2 创建一个具体线程的步骤:1) 继承于Thread类2) 覆盖run 方法(就是更新运行过程), 实现用户自己的过程3) 创建线程实例(一个线程)4) 使用线程实例的start() 方法启动线程

12、, 启动以后线程会尽快的去并发执行run(),二、重点:线程的状态 1 New 新建状态 当程序使用new关键字创建了一个线程后,该线程就处于新建状态,此时线程还为启动 当线程对象调用start()方法时,线程启动,进入Runnable状态2 Runnable 可以运行(就绪):等待获取CPU3 Running 运行(正在运行):Thread.yield() 当前线程让出处理器(离开Running), 使当前线程进入Runnable等待,4 Block 阻塞(挂起) 当发生如下情况,线程就会进入阻塞状态 1.线程调用sleep方法主动放弃所占用的cpu资源 2.线程调用了一个阻塞式io方法,在

13、该方法返回之前,该线程被阻塞。 3.线程试图获得一个同步监时器,但该同步监时器正被其它线程所持有。 4.线程正在等候通知 5.程序调用了线程的suspend方法将该线程挂起。不过,这个方法容易死锁,所以程序应该避免使用该方法,注意: 当前正在执行的线程被阻塞之后,其它线程就可以获得执行的机会了。被阻塞的线程在合适的时候重新进入Runnable状态,注意是Runnable状态而不是Running状态。也就是被阻塞线程的阻塞被解除后,必须重新等待线程调度器再次调度它。,针对上面的几种情况,当发生如下特定的情况将可以解除上面的阻塞,让该线程重新进入就绪状态 1.调用sleep方法的线程经过了指定时间

14、 2.线程调用的阻塞式io方法已经返回. 3.线程成功获得了试图取得的同步监时器 4.线程正在等待某个通知时,其它线程发出了一个通知 5.处于关起状态的线程被调用了resume的恢复方法。,5 Dead 死亡状态 1)当线程的run()方法执行结束,线程进入Dead状态 2)注意:不要试图对一个已经死亡的线程调用start()方法,线程死亡后将不能再次作为线程执行,系统会抛出IllegalThreadStateException,注意:,三、线程状态管理: 1)让出CPUThread.yield() 当前线程让出处理器(离开Running), 使当前线程进入Runnable等待Thread.y

15、ield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。 yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。,结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。2)休眠Thread.sleep(times) 使当前线程从 Running 放弃处理器进入Block状态, 休眠time

16、s毫秒, 再返回到Runnable如果其他线程打断当前线程的Block(sleep), 就会发生InterruptedException.,四、线程的常用属性1)线程的优先级 (资源紧张时候, 尽可能优先)t3.setPriority(Thread.MAX_PRIORITY); 线程优先级最高:10 优先级高的线程获得执行的机会多. 机会的多少不能通过代码干预.默认的优先级是 5,2)后台线程(守护线程, 精灵线程)t1.setDaemon(true);Java进程的结束: 当前所有前台线程都结束时, Java进程结束后台线程, 不管是否结束, 都被停掉! 因为并发的现象, 后台线程不会立即结束! 3) 线程名字getName()4) 当前线程Thread main = Thread.currentThread();,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号