腾讯面试官必问:进程和线程的区别?线程生命周期与状态转换?90%开发者答不完整!
腾讯面试官必问:进程和线程的区别?线程生命周期与状态转换?90%开发者答不完整!
前言
Java 并发面试基础必考题天花板:进程与线程区别、线程七大状态与流转流程。
很多面试者只会一句:进程资源独立,线程共享资源。
一旦面试官追问:
线程有几种状态?WAITING 和 BLOCKED 区别?RUNNABLE 到底是不是正在运行?状态流转顺序?
绝大多数人直接混乱翻车。
本篇一次性讲透 进程线程核心区别 + 线程完整生命周期 + 所有状态转换规则,零基础也能看懂,面试直接背诵满分!
一、什么是进程、什么是线程
进程
操作系统资源分配的最小单位
进程是独立运行的程序,拥有独立内存空间、堆、文件资源,进程之间完全隔离。
线程
CPU 调度的最小单位
线程隶属于进程,一个进程包含多个线程,线程共享进程资源,栈私有。
二、进程和线程的核心区别(面试必背)
-
资源隔离不同
进程:资源独立,互不干扰。
线程:共享进程堆、方法区资源,仅栈空间私有。 -
开销不同
进程:创建、销毁、切换开销极大。
线程:轻量级,开销极小。 -
通信方式不同
进程:IPC管道、socket,通信复杂。
线程:直接共享变量,通信简单。 -
独立性不同
进程崩溃互不影响。
一个线程异常崩溃,整个进程直接挂掉。 -
粒度不同
进程:资源分配单位
线程:CPU调度执行单位
三、总结一句话区分
进程是资源仓库,线程是干活的工人。
四、Java 线程的 6 大状态(JDK 定义)
Java 线程一共 6 种状态(面试必考,不是5种!)
-
NEW(新建)
线程创建完毕,未调用 start(),未启动。 -
RUNNABLE(就绪/运行中)
包含两种情况:
- 正在 CPU 运行
- 等待 CPU 时间片
重点:Java 没有单独的 Running 状态!
-
BLOCKED(阻塞)
等待获取 synchronized 锁,锁被占用导致阻塞。 -
WAITING(无限等待)
主动休眠,无超时,不主动唤醒永远不醒
触发:wait()、join() -
TIMED_WAITING(限时等待)
限时休眠,时间到自动唤醒
触发:sleep()、wait(时间)、join(时间) -
TERMINATED(终止)
线程执行完毕,彻底结束。
五、核心难点:BLOCKED / WAITING 区别(面试高频)
-
BLOCKED:抢锁失败被动阻塞
是因为别人拿着锁,自己进不去,被动等待。 -
WAITING:自己主动躺平等待
主动放弃 CPU,等待别人唤醒。
六、线程完整状态流转全过程(满分必背)
- NEW → 调用 start() → RUNNABLE
- RUNNABLE 抢到 CPU → 运行
- RUNNABLE 遇 synchronized 抢锁失败 → BLOCKED
- RUNNABLE 调用 wait/join → WAITING
- RUNNABLE 调用 sleep → TIMED_WAITING
- BLOCKED/WAITING/TIMED_WAITING 唤醒后 → 回到 RUNNABLE
- 代码执行结束 → TERMINATED
极简流转口诀
新建启动可运行,抢锁阻塞,等待休眠,执行结束终止。
七、面试满分标准回答(直接背诵)
进程是操作系统资源分配的最小单位,线程是CPU调度的最小单位。
进程资源独立、开销大、隔离性强;线程共享进程资源、开销小、通信简单,线程崩溃会导致整个进程退出。
Java线程一共有六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。
线程启动后进入可运行状态,抢锁失败进入阻塞、调用等待方法进入无限等待、调用sleep进入限时等待,所有阻塞等待被唤醒后都会回到可运行状态,代码执行完毕进入终止状态。
其中 BLOCKED 是抢锁被动阻塞,WAITING 是主动休眠等待。
八、高频面试误区纠正
❌ 误区1:Java线程有 Running 状态
错!JDK 没有 Running,统一叫 RUNNABLE
❌ 误区2:WAITING 和 BLOCKED 一样
完全不同:一个主动、一个被动
❌ 误区3:线程休眠属于 BLOCKED
错!sleep 是 TIMED_WAITING
总结
进程线程区别考资源与粒度,线程生命周期考6大状态+流转。
只要分清:阻塞是抢锁、等待是休眠、可运行包含运行与就绪,这道面试题直接满分。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)