进程与线程
概念 | 说明 |
---|---|
进程 | 对正在运⾏的程序的抽象,就是负责加载指令,管理内存,管理io等工作,应⽤程序(指令+数据)在内存中分配的空间,各个进程之间互不⼲扰。 |
线程 | 让⼀个线程执⾏⼀个⼦任务,这样⼀个进程就包含了多个线程,每个线程负责⼀个单独的⼦任务,多线程比多进程之间更容易共享数据,所以线程一般来说都比进程更高效。 |
进程和线程的区别:
进程是⼀个独⽴的运⾏环境,⽽线程是在进程中执⾏的⼀个任务。他们两个本质的区别是是否单独占有内存地址空间及其它系统资源。
- 进程单独占有⼀定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不⼲扰;⽽线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂。
- ⼀个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性高,⼀个线程崩溃可能影响整个程序的稳定性,可靠性较低。**
- 进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及⻚调度,开销较⼤;线程只需要保存寄存器和栈信息,开销较⼩
- 进程是操作系统进⾏资源分配的基本单位,⽽线程是操作系统进⾏调度的基本单位,即CPU分配时间的单位
JAVA线程的状态
以jdk 1.8 Thread类的State枚举类划分为六个状态:
- NEW(新建状态)
- RUNNABLE(可运行状态)
- BLOCKED(阻塞状态)
- WAITING(等待状态)
- TIMED_WAITING(超时等待状态)
- TERMINATED(终止状态)
我们具体的再细分可以分为七个状态:
- New(新建状态)
- Ready(就绪状态)
- Running(运行状态)
- Terminated(终止状态)
- Waiting(等待状态)
- TimedWaiting(超时等待状态)
- Blocked(阻塞状态)
详细状态之间的转换可以参考:「图解」透彻Java线程状态转换,此大佬已经给出了很详细的图文解释。
多线程的几个重要概念区分
概念 | 说明 |
---|---|
同步 | 两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据(一个进程或线程依赖于其他进程线程的结果作为其自身的运行必要条件) |
互斥 | 一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源 |
并发(concurrent) | 是同一时间应对(dealing with)多件事情的能力,同时具有处理多个逻辑任务的能力(传统单核cpu,通过时间片在不同线程上执行) |
并行(parallel) | 是同一时间动手做(doing)多件事情的能力,用并发使一个系统运行的更快(多核cpu,可真正在同一时间执行不同线程的任务) |
临界区 | 指的是某⼀块代码区域,它同⼀时刻只能由⼀个线程执⾏ |