1.I/O流
1.1 ObjectOutputStream类(重点)
(1)基本概念
java.io.ObjectOutputStream类主要用于将Java对象整体写入到输出流中。
只能将支持 java.io.Serializable 接口的对象写入流中。
类通过实现 java.io.Serializable 接口以启用其序列化功能。
当把一个对象整体写入输出流时,需要将对象的各种相关信息有效地组织成一个字节序列再存储,这个组织的过程就叫做序列化。

(2)常用的方法
ObjectOutputStream(OutputStream out) - 根据参数指定的引用来构造对象。
- 其中OutputStream类是个抽象类,实参需要传递子类的对象。
void writeObject(Object obj) - 用于将参数指定的对象写入输出流中。
void close()

1.2 ObjectInputStream类(重点)
(1)基本概念
java.io.ObjectInputStream类主要用于将Java对象整体从输入流中读取出来。

(2)常用的方法
ObjectInputStream(InputStream in) - 根据参数指定的引用构造对象。
- 其中InputStram类是个抽象类,实参需要传递子类的对象。
Object readObject() - 用于从输入流中读取对象并返回。
void close()

分享经验:
当需要向文件中写入多个对象时,建议将多个对象放入一个集合中,然后将这个集合整体看做一个对象调用writeObject()方法写入,此时只需要调用一次readObject()方法即可。

2.线程
2.1 基本概念
程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件。
进程 - 主要指运行在内存中的程序。

目前主流的操作系统都支持多进程,是为了让操作系统能够同时执行多个任务,但进程是重量级的,新建进程对系统资源的消耗比较大,因此进程的数量是有限的。
线程是进程内部的程序流,也就是说操作系统中支持多进程,而每个进程的内部又可以支持多线程,并且线程是轻量级的,新建线程会共享所在进程的资源,因此对资源消耗比较小。
以后的主流开发都采用多线程机制,而操作系统中主要采用时间片轮转法来保证多任务的同时执行,该策略叫做并发机制,也就是宏观并行,微观串行的机制。

2.2 线程的创建(重中之重)
(1)Thread类创建线程的方式
java.lang.Thread类主要用于描述线程,Java虚拟机允许Java程序启动多个线程并同时执行
创建线程的方式:
a.自定义类继承Thread类并重写run()方法,然后创建自定义类的对象调用start()方法
b.自定义类实现Runnable接口并重写run()方法,然后创建自定义类的对象作为创建 Thread类对象的实参,最后使用Thread类的对象调用start()方法。

(2)创建线程的有关方法
Thread() - 无参的方式构造对象。
Thread(String name) - 使用参数指定的名称来构造对象。
Thread(Runnable target) - 根据参数指定的引用来构造对象。
- 其中Runnable是个接口,实参的传递方式有两种:
a.自定义类实现Runnable接口,构造自定义类的对象作为实参传递。
b.使用匿名内部类直接构造接口类型的引用作为实参传递。
Thread(Runnable target, String name)
- 使用参数指定的引用和名称共同构造对象。

void run() -若使用接口类型引用构造的线程对象调用该方法,则最终调用接口指向的版本
-若没有使用接口引用构造的线程对象调用该方法,则啥也不做。
void start() - 用于启动线程,Java虚拟机会自动调用该线程对象的run()方法。

原理(掌握):
找到Thread类的无参构造方法 => 调用init()方法,第二个实参为null => 点开init()方法的方法体,将实参null赋值给第二个形参target => target作为第二个实参传给init()方法 => 此时init()方法的第二个形参target变成了null => 将null赋值给了成员变量target.
找到run()方法的源码 => if (target != null) {target.run();},条件不成立 =>
此时证明run()方法啥也不干。

(3)线程创建的执行原理
执行main()方法的线程叫做主线程,执行run()方法的线程叫做子/新线程。
对于start()方法之前的代码来说,由主线程执行一次,当start()方法调用成功后,则线程的个数瞬间由1个变成了2个,其中新创建的子线程去执行run()方法,主线程继续执行后续代码,两个线程同时执行互不影响。
当run()方法结束时则子线程结束,当main()方法结束时则主线程结束,两个线程执行的先后次序没有明确的规定,由系统调度算法决定。

注意:
创建线程两种方式里面继承相对简单容易理解,但是Java语言支持单继承,若一个类继承Thread类后则无法继承其他类,因此推荐使用第二种方式来创建线程,从而提高代码的可维护性和可扩展性。

2.3 线程的编号和名称(熟悉)
long getId() - 用于获取调用对象的线程编号。
String getName() - 用于获取调用对象的线程名称。
void setName(String name) - 用于设置线程名称为参数指定数值。
static Thread currentThread() - 用于返回当前正在执行线程对象的引用。

2.4 线程的主要状态(了解)
新建状态 - 当使用new关键字创建线程对象之后进入的状态。
- 此时该线程并没有开始执行。
就绪状态 - 当线程对象调用start()方法之后进入的状态。
- 此时该线程仍然没有开始执行。
运行状态 - 当线程对象被线程调度器调度之后进入的状态。
- 此时该线程开始执行。
- 当线程对象的时间片执行完毕但任务没有完成时回到就绪状态。
消亡状态 - 当线程对象的时间片执行完毕并且任务已经完成后进入的状态。
阻塞状态 - 当线程执行过程中发生阻塞事件后进入的状态,如:sleep()方法。
- 当阻塞解除后进入就绪状态。

2.5 常用的方法
static void sleep(long millis)
- 用于使得当前正在执行的线程进入休眠状态,休眠参数指定的毫秒(重点)。
static void sleep(long millis, int nanos)
- 用于休眠参数指定的毫秒+纳秒,1秒=1000毫秒 1毫秒=1000微秒 1微秒=1000纳秒

(1)I/O流 (2)线程的更多相关文章

  1. Java集合、IO流、线程知识

    一.集合: 1. 集合框架: 1)Collection (1)List:有序的,有索引,元素可重复. (add(index, element).add(index, Collection).remov ...

  2. hdu 2686 费用流 / 双线程DP

    题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1  费用流法:思路转化:从左 ...

  3. io流+网络+线程池 实现简单的多客户端与服务器端通信

    1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.io.OutputStream; 4 import ...

  4. java:管道流(线程间管道流)

    class Send implements Runnable{ PipedOutputStream pos = null; public Send() { this.pos = new PipedOu ...

  5. JAVA中管道通讯(线程间通讯)例子

    Java I/O系统是建立在数据流概念之上的,而在UNIX/Linux中有一个类似的概念,就是管道,它具有将一个程序的输出当作另一个程序的输入的能力.在Java中,可以使用管道流进行线程之间的通信,输 ...

  6. java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream

    管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把 ...

  7. Java基础知识强化之IO流笔记61:输入流 和 输出流 使用总结

    1. 结构: 字节流:InputStream,OutputStream 字符流:Reader,Writer 2. 字符流 和 字节流: (1)Reader:读取字符流的抽象类 BufferedRead ...

  8. JAVA IO之管道流总结大全(转)

    要在文本框中显示控制台输出,我们必须用某种方法“截取”控制台流.换句话说,我们要有一种高效地读取写入到System.out和 System.err 所有内容的方法.如果你熟悉Java的管道流Piped ...

  9. Linux编程---线程

    首先说一下线程的概念.事实上就是运行在进程的上下文环境中的一个运行流.普通进程仅仅有一条运行流,可是线程提供了多种运行的路径并行的局面. 同一时候,线程还分为核心级线程和用户级线程.主要差别在属于核内 ...

随机推荐

  1. 关于 centos 7系统,iptables透明网桥实现

    首先建立网桥:(使用bridge)    示例 桥接eth0 与 eth1 网口 /sbin/modprobe bridge /usr/sbin/brctl addbr br0 /sbin/ifup ...

  2. src或者href值为base64编码代码

    大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如:data:image/png;base64, iVBORw0KGgoAAAANSUhEUgnZVJlYWR5c ...

  3. 使用<% =Type%>获取后台值时报错:控件包含代码块(即 <% ... %>),因此无法修改控件集合。

    <% =Type%>不能放在runat="server"的标签中,删掉runat="server"之后dev的控件回调第一次发生时会刷新页面,有ru ...

  4. 边框阴影box-shadow

    边框的阴影: 参数说明: box-shadow:1px 2px 3px 4px #ccc inset: 1px 从原点开始,沿x轴正方向的长度(倘若为负值,为沿x轴负方向的长度) 2px 从原点开始, ...

  5. sgsdg

    wrjow we wetwer werwer werwer werqw qweqwrq qwrqwr @ApiOperation("根据条件分页查询试卷") @ApiRespons ...

  6. insert into 语句的三种写法

    insert into 语句的三种写法 方式1. INSERT INTO t1(field1,field2) VALUES (v001,v002);            // 明确只插入一条Valu ...

  7. graphviz 的绘图布局

          graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言):dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局. graphviz中包含了众多 ...

  8. 【学习笔记】--- 老男孩学Python,day13 生成器,生成器函数,各种推倒式和生成器表达式

    1. 生成器和生成器函数 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 2.通过生成器表达式创建生成器 3.通过数据转换   2. 生成器函数: 函数中包含了yield的就是生成 ...

  9. YII关联查询

    原文链接:http://keshion.iteye.com/blog/1607994 一.多表关联的配置 在我们使用 AR 执行关联查询之前,我们需要让 AR 知道一个 AR 类是怎样关联到另一个的. ...

  10. JS(微信小程序)处理银行卡号

    其实这是一个小程序的项目,但是JS还是那个JS 在本项目中要实现两种效果: 每隔四位插入空格: <view class='item_list'> <label>银行卡号:< ...