一、进程与线程
1、进程和线程分别是什么?
进程:进程是计算机中和程序关于数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。
线程:进程的子集,它是进程内部的一个独立的执行单元,一个进程可以同时并发执行多个线程。
2、进程和线程的区别
进程:有独立的内存空间,进程中的数据存放空间是独立的(堆空间和栈空间都独立),进程中至少有一个线程。
线程:推空间是共享的,而栈空间是独立的,纯种消耗的资源比进程小的多。
3、注意
① 因为一个进程中的多个线程是并发运行的,那么从微观上看它是有先后顺序的,哪个线程应该执行完全取决于CPU的调度,程序员是干涉不了的,这也决定了多线程运行的随机性;
② Java程序的进程至少包含两个线程,一个是主线程也就是main()方法执行的线程,一个是垃圾回收机制线程。
二、进程的三态和五态模型
1、进程的五态模型
在五态模型中,进程分为新建态(new)、就绪态(ready)、运行态(running)、阻塞态(waiting)、终止态(terminated)。
新建态:进程在创建时需要申请一个空白进程管理块,向其中填写控制和管理进程的信息,完成资源分配;
就绪态:进程已经准备好,已经分配到所需资源,只要分配到CPU就能够立刻运行;
运行态:进程处于就绪状态被调度后,进入运行态;
阻塞态:正在执行的进程由于某些某些事件(如I/O调用)而无法运行,进程受到阻塞;
终止态:进程结束,或出现错误,或被系统终止,进入终止状态。
它们的关系如下图:
2、进程的三种状态之间的转化
进程的三种状态之间的转化指的是就绪态、运行态和阻塞态之间的转化。从理论上分析有4可能的情况,如下:
① 就绪态 》》运行态:其他进程时间片用完,CPU调度选中一个就绪进程执行;
② 运行态 》》就绪态:分配给每个进程的时间片是有限的,运行时间片到了或出现更高优先权进程就进入到就绪态;
③ 运行态 》》阻塞态:正在执行的进程因发生某种等待事件而无法执行,如发生了I/O请求,此时由运行态转换到阻塞态;
④ 阻塞态 》》 就绪态:进程所等待的事件已经发生,进程进入就绪队列。
它们之间的转化图如下:
三、JVM中的线程状态
1、JVM中线程的六种状态
在Thread类中,从JDK1.5开始定义了一个枚举类State,枚举了线程的六种状态。通过Thread的getState()方法可以获取线程的状态。
① 新建状态(NEW):一个尚未启动的线程所处的状态;
② 可运行状态(RUNNABLE):可运行线程的线程状态,可能正在运行,也可能在等待处理器资源;
③ 阻塞状态之锁阻塞(BLOCKED):被阻塞等待监视器锁定的线程所处的状态(即当一个线程试图获取锁,但锁此时被其他线程持有,该线程进入BLOCKED状态,当线程拿到锁则进入RUNNABLE状态);
④ 阻塞状态之无限等待(WAITING):未指定等待时间的线程所处的状态(调用Object.join()或Object.wait()方法时进入此状态,一个线程处于该状态时,只能被另一个线程唤醒,而不能自己主动唤醒,另一个线程调用notify()或notifyAll()来唤醒该线程);
⑤ 阻塞状态之定时等待(TIMED_WAITING):指定等待时间的线程所处的状态(调用Thread.sleep(long)或Object.join(long)或Object.wait(long)方法时进入此状态,直到时间超时或收到唤醒通知,注意wait(0)时是可以自己苏醒的,比如当Thread结束时就会自动苏醒);
⑥ 终止状态:已经执行完成的线程状态。
关于wait()和join()的使用区别可以参考:join和wait
2、操作系统进程的状态与JVM中的线程状态区分
JVM中的线程状态跟操作系统进程的五态模型是有区别的,Java线程在Windows平台和Linux平台上的实现方式,是内核线程的实现方式,这样的方式实现的线程,是直接由操作系统内核支持的,内核通过操纵调度器来实现线程调度。也就是说,Java的线程跟操作系统的内核之间存在映射关系,这种映射可以是一对一映射,也可以是一对多或多对多映射。所以说,Java中任一给定时间的线程状态是不反映任何操作系统进程状态的虚拟机状态。
进程与线程的区分图如下: