深入理解 Java 并发基础:进程与线程的区别及状态详解
在高并发场景下,理清进程(Process)与线程(Thread)的底层关系是进行 Java 并发编程的前提。本文从资源调度的角度剖析两者的定义与特征,详细解读 java.lang.Thread 中定义的六种生命周期状态及其转换条件,并通过“工厂车间”模型直观展示互斥锁与信号量的工作原理。
进程的基本特征与运行原理
进程是操作系统进行资源分配和调度的基本单位,也是程序的一次执行过程。程序本身是指令、数据及其组织形式的静态描述,而进程则是程序的实体,具有临时的生命周期,动态产生并最终消亡。
在 Windows 系统中,.exe 文件代表一个程序,双击加载后,指令被系统载入内存,便形成了一个正在运行的进程。通过打开任务管理器,可以查看当前系统中所有活跃的进程列表:
进程具备以下四个核心特征:
- 动态性:进程是程序的一次执行过程,具有明确的起始和结束时间,区别于静态的程序代码。
- 并发性:多个进程可以在单核或多核处理器上交替执行,从宏观上看同时存在。
- 独立性:进程是系统进行资源分配的一个独立单元,拥有独立的地址空间。
- 结构性:进程由程序段、数据段以及进程控制块(PCB)三部分组成。
轻量级的线程与状态机
线程是程序执行的最小单元,被称为“轻量级进程”。在 Java 等语言中进行并发设计时,优先使用多线程而非多进程,主要是因为线程间的切换成本远低于进程,且线程共享所属进程的内存空间,通信更为高效。
在 Java 中,线程的生命周期由 java.lang.Thread.State 枚举严格定义,共包含六种状态:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
第一步骤:NEW(新建状态)
目的:创建线程实例但未启动。
动作:执行 new Thread()。
说明:此时线程尚未开始执行任何代码,一旦调用 start() 方法,将进入 RUNNABLE 状态。
第二步骤:RUNNABLE(可运行状态)
目的:等待 CPU 时间片或正在执行。 动作:线程启动后或从阻塞/等待状态恢复。 说明:处于此状态的线程可能在运行,也可能在等待操作系统分配 CPU 资源。
第三步骤:BLOCKED(阻塞状态)
目的:获取同步锁失败。
动作:当线程尝试进入被 synchronized 修饰的代码块或方法,但锁已被其他线程持有时,当前线程进入 BLOCKED。
完成状态:直到获取到锁对象后,自动转回 RUNNABLE 状态继续执行。
第四步骤:WAITING/TIMED_WAITING(等待状态)
目的:无限期或有限期等待特定事件触发。
动作:
- WAITING:通常由 wait()、join() 无参调用引发,需等待其他线程主动通知(如 notify())或目标线程终止。
- TIMED_WAITING:由带有超时参数的方法(如 sleep(ms)、wait(timeout)、join(timeout))引发。
完成状态:当事件发生或超时结束时,线程转回 RUNNABLE。
第五步骤:TERMINATED(终止状态)
目的:线程执行完毕或因异常退出。 说明:这是线程的终态,无法再次回到运行状态。需要注意的是,从 NEW 出发后的线程不能回到 NEW,同样 TERMINATED 也不能回到 RUNNABLE。
直观理解:进程与线程的协作模型
为了更形象地理解操作系统中进程与线程的关系,我们可以将计算机 CPU 想象成一个大型工厂:
- CPU 即工厂:CPU 承担所有计算任务,如同工厂的核心动力源。
- 电力限制与任务排队:假设工厂电力有限,一次只能供给一个车间使用。这意味着单个 CPU 核心在任一时刻只能运行一个任务(进程),其他任务处于非运行状态。
- 进程即车间:每个进程相当于一个独立的车间,代表 CPU 处理的一个完整任务单元。
- 线程即工人:一个车间(进程)内部可以雇佣多名工人(线程)协同工作。线程是实际执行具体指令的主体。
- 内存空间的共享:车间内的房间(内存区域)由所有工人共享。这意味着同一进程下的多个线程可以访问相同的堆内存和方法区数据,提高了数据交换效率。
- 互斥锁(Mutex)机制:并非所有房间都能随意进出。例如洗手间(临界区)同一时间只能容纳一人。若有人占用,其他人需在门口排队。在代码中,这通过
synchronized或显式Lock实现,防止多个线程同时读写共享内存导致数据竞争。
- 信号量(Semaphore)机制:对于厨房等多人数作业区,可能只允许固定数量(如 N 人)同时进入。此时使用信号量管理,初始发放 N 把“钥匙”(许可)。进去的人取走一把,出来归还。若钥匙发完,后续线程必须排队等待。这有效控制了并发访问资源的最大数量。
总结
操作系统的并发设计主要归结为三点:以多进程形式允许多个独立任务并行运行;以多线程形式将单个复杂任务分解为部分协同执行;并提供完善的协调机制(如锁和信号量)来防止冲突并支持资源共享。掌握这些基本概念,是编写高性能 Java 并发代码的基石。
以上就是 Java 高并发之理解进程和线程的详细内容,更多关于 Java 并发编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









