JavaSE基础(day19)(1)I/O流(2)线程的基本概念和基本操作(3)线程的同步机制

版权声明:cxyo.cn https://blog.csdn.net/weixin_44075537/article/details/85002173

默写:
1.编程题
使用三种方式实现文件的拷贝。

代码
(1)I/O流
(2)线程的基本概念和基本操作
(3)线程的同步机制

1.I/O流
1.1 ObjectOutputStream类(重点)
(1)基本概念
java.io.ObjectOutputStream类用于将对象整体写入到输出流中。
只能将支持 java.io.Serializable 接口的对象写入流中。
类通过实现 java.io.Serializable 接口以启用其序列化(将一个对象中的所有内容转换为字节序列的过程)功能。

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

1.2 ObjectInputStream类(重点)
(1)基本概念
java.io.ObjectInputStream类用于从输入流中整体读取一个对象。

(2)常用的方法
ObjectInputStream(InputStream in) - 根据参数指定的引用来构造对象。
- 其中InputStream类是个抽象类,实参需要传递子类的对象。
Object readObject() - 用于读取一个对象并返回。
- 无法根据返回值来判断是否读取到文件的末尾。
void close()

经验:
当需要向文件中写入多个对象时,通常建议将这些对象先放入到一个集合中,将整个集合看做一个整体写入文件中,此时读取文件中的数据只需要调用一次readObject()方法就可以读出所有内容。

2.线程的基本概念和基本操作
2.1 基本概念
程序 - 主要指存放在硬盘/磁盘上的可执行文件。
进程 - 主要指运行在内存中的程序。

目前主流的操作系统都支持多进程,为了同时执行多个任务,进程是重量级的,新建进程对系统的资源消耗比较大,因此进程的数量还是有限的。
线程就是指进程内部的程序流,是轻量级的,新建线程会共享所在进程的资源,因此对系统的资源消耗比较小,以后开发中采用多线程技术是主流的方式。
目前主流的操作系统都是采用时间片轮转法来保证多个任务的并发执行效果,所谓的并发就是指宏观并行微观串行。

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

(2)Thread类的方法
Thread() - 使用无参的方式构造对象。
Thread(Runnable target) - 根据参数指定的接口引用来构造对象。
- 实参可以传递实现类的对象,或者使用匿名内部类。
Thread(String name) - 根据参数指定的名称来构造对象。
Thread(Runnable target, String name) - 参数指定接口引用和名称。

void run() - 若使用Runnable接口作为参数构造的线程对象,则最终调用接口中的run()方法;否则该方法啥也不做直接返回。
void start() - 启动线程并自动调用run()方法。

(3)原理分析
执行main()方法的线程叫做主线程,执行run()方法的线程叫做新线程/子线程。
对于start()方法之前的代码来说,只会被主线程执行一次,当start()方法调用成功后,线程的个数瞬间由1个变成了2个,其中新创建出来的线程去执行run()方法,原来执行main()方法的主线程继续向下执行,两个线程各自独立运行。
当run()方法结束时,则子线程结束;当main()方法结束时,则主线程结束。
主线程和子线程之间没有明确的执行先后次序,由系统的调度算法来决定。

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

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

视频
javaseday19-作业讲解-01
https://v.qq.com/txp/iframe/player.html?vid=x0798xmknao
javaseday19-对象流的概念和使用-02
https://v.qq.com/txp/iframe/player.html?vid=f079861xi6d
javaseday19-线程的基本概念-03
https://v.qq.com/txp/iframe/player.html?vid=t0798332gnr
javaseday19-线程的创建和启动-04
https://v.qq.com/txp/iframe/player.html?vid=r0798eje4xt
javaseday19-线程编号和名称以及主要状态-05
https://v.qq.com/txp/iframe/player.html?vid=m0798bxu8ig

代码
https://pan.baidu.com/s/1i7gM7XiEF47BP8SImQLxRw

作业:
1.思考:
创建和启动线程两种方式之间的区别是什么?
2.使用继承的方式启动一个子线程,在子线程中打印每隔1秒打印一句话“纸上谈来
终觉浅,绝知此事要躬行!”,总共打印10次。
要求主线程等待5秒后打印“等不住你了,再见!”。
3.要求在学生信息管理系统中增加两个功能:
a.要求启动该项目时,先读取文件中的所有学生信息。
b.要求退出该项目时,将所有的学生信息写入到文件中。

猜你喜欢

转载自blog.csdn.net/weixin_44075537/article/details/85002173