一、进程
1.进程的概念
进程:一个程序运行起来,就会对应一个进程。
ps:进程是系统分配资源的基本单位。
2.PCB核心属性(进程调度)重点&难点
1)pid进程标识符
2)内存指针,该进程依赖的指令和数据都在哪里
3)文件描述符表,该进程打开了哪些文件
4)状态,优先级,上下文,记账信息
二、线程
1.线程的概念
线程:可以理解成“进程的子集”,一个进程中,可以有一个线程,或者多个线程。
线程是系统调度执行的基本单位。
引入线程的概念主要原因是为了解决“进程”重量级的问题。
进程进行创建/销毁的代价很大,因此我们引入了线程。
线程也称为“轻量级进程”,创建/销毁的代价较小。
同一个进程的若干线程之间,是共用相同的内存资源和文件资源的,但是每个线程都是独立地在CPU上调度执行的。
线程比进程更轻量的核心在于,创造进程已经进行了资源分配,在之后该进程中创造线程时就无需再次申请资源分配。
三、进程和线程的区别 重点
1.根本区别:
进程是系统资源分配的基本单位,而线程是系统调度执行的基本单位。
2.资源开销:
线程可以认为是轻量级的进程,同一进程的各线程共享资源,每个线程之间切换的开销小。而进程作为重量级,创建和销毁的代价就比线程大。
3.包含关系:
一个进程包含一个或多个线程。
4.健壮性:
一个进程崩溃后,不会影响其他进程,但是会影响该进程下的所有线程。
但一个线程崩溃后,会使该线程的进程崩溃,该进程的所有线程都会坏死。即牵一发而动全身。
所以多进程的健壮性比多线程强
四、创建线程的方法 重点
1.创建Thread子类,重写run方法。
run方法描述了线程将要执行什么任务。
后续调用 start 创建线程的时候,线程就会自动把 run 方法进行执行。
2实现Runnable接口,重写run方法。
使用 Runnable 表示任务的具体情况,同时也是为了解耦合。
3.创建Thread类,重写run方法,使用匿名内部类
a)创建一个Thread的子类(具体名字不知道)
b)同时创建这个子类的实例
c)重写run方法
Thread t = new Thread() {
public void run() {
while(true) {
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
4.实现Runnable接口,重写run方法,使用匿名内部类
a)创建一个新的类,实现Runnable,但该类的名字是匿名的
b)创建该类的实例(一次性)
c)重写run方法
Thread t = new Thread() {
public void run() {
}
});
5.lambda表达式
lambda 本质上就是匿名内部类的平替
Thread t = new Thread(()-> {
});
此处的 lambda 就是要代替刚才重写的run
上述5种写法的本质都是:
1.要把线程执行的任务内容表示出来。
2.通过 Thread 的 start 来创建/启动系统中的线程