文章目录
这是一篇可以七嘴八舌,冷嘲热讽和无情打击的博文。
1 程序与进程
程序:计算机程序是一组计算机能识别和执行的指令。程序就是一个指令序列,一个程序可以建立一个或多个进程。
1.1 进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程是程序的基本执行实体;进程是线程的容器。一个进程可以创建多个进程,子进程可以继承父进程所拥有的资源。
1.1.1 进程的3种基本状态
一个程序在运行的过程中有三种基本状态:
-
就绪状态(Ready)
在就绪状态时,进程只差 CPU 这个东风吹来便可以开始它的运行(即获得处理器资源进入运行态)。 -
运行状态(Running)
如果当前进程手里的分配CPU时间用完了,它就会转换为就绪(Ready)状态。 -
阻塞状态(Blocked)
如果进程当前时间片没有用完,它又需要某种资源才能继续运行(例如读写磁盘,即I/O 操作)而这个资源又被别人占用时,它只能无奈地进入阻塞状态(Blocked)。而当它完成读写操作之后,很抱歉,不能直接运行(Running),而需要进入就绪(Ready)状态。
关于这三种状态之间怎么进行转换,接下里为各位看官奉上状态图一张。
由此图可知:
- 从就绪态可以转换为运行态;
- 从运行态可以转换为就绪态和阻塞态;
- 从阻塞态可以转换为就绪态。
1.1.2 进程的挂起状态
基于进程间的协调和性能的需要,引入了进程的挂起状态。
如图所示为具有挂起状态的进程转换图。
2 进程与线程
进程的引入的目的是使多个程序并发执行以改善资源利用率和系统吞吐量,但是由于进程的创建、撤销和切换中,系统会付出较大的开销,限制了并发程度的进一步提高。
进程的两个基本属性:1、进程是一个可拥有资源的独立单位;2、进程又是一个可以独立调度和分派的基本单位。在 “可否将进程的上述两个属性分开,由系统分开进行处理” 的思想下,产生了线程的概念。
2.1 线程
线程是进程的一个实体,是可以被系统独立调度和分派的基本单位。它与同属一个进程的其他线程共享进程的资源(线程自己不拥有系统资源)。一个线程可以创建和撤销另一个进程,同一进程中的多个线程之间可以并发执行。
相应的,线程也拥有就绪、阻塞和执行3中基本状态。
引入线程的好处::
- 创建一个新线程花费时间少(结束亦如此)。创建线程不需另行分配资源,因而创建线程的速度比创建进程的速度快,且系统的开销也少。
- 两个线程的切换花费时间少。
- 由于同一进程内的线程共享内存和文件,线程之间相互通信无须调用操作系统内核,故不需要额外的通信机制,使通信更简便,信息传送速度也快。
- 线程能独立执行,能充分利用和发挥处理器与外围设备并行工作的能力。
3 并行和并发的区别
并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
注:并行现象只能出现在多处理器(或单处理器多核)系统,并发现象能存在单处理器(单处理器单核)和多处理器系统中。
4 多线程实现方式
Java多线程的实现有两种方式:
1.实现 Runnable 接口,重写 run 方法
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Thread.currentThread().getName());
new Thread(() -> {
System.out.println("Runnable 接口实现" + Thread.currentThread().getName());
}).start();
}
}
这种实现方式没有返回值(即 run 方法返回值为 void)
2. 实现 Callable 接口,重写 call 方法
为
public cl