Java进程与线程的区别以及线程状态总结

在并发编程里,"进程"和"线程"这两个词经常被混着用,但它们其实分工非常明确:进程更像"资源的容器",线程更像"在容器里跑起来的执行流"。把这层关系想清楚,后面理解 Java 的线程状态机(Thread.State)就顺畅很多。

进程 vs 线程:区别与联系

1)线程是什么

我更愿意用一句话来记:线程就是一条执行流(execution flow)。它按顺序执行代码;多个线程并发执行,就像"多个执行流同时推进同一项大任务的不同子任务"。

2)进程是什么

进程是操作系统进行资源分配的基本单位 。它通常拥有自己独立的一套资源视图:地址空间、打开的文件/网络句柄等(具体细节取决于 OS)。进程的核心意义是:把资源和故障隔离起来------一个进程崩溃,通常不至于直接把别的进程一起带走。

3)两者的关键区别(抓住主干就够了)

  • 包含关系 :进程里包含线程;一个进程至少有一个线程(主线程)
  • 内存关系进程与进程之间不共享内存空间 ;同一进程内的线程共享同一块内存空间(因此线程通信更方便,但也更容易"互相踩脚"引发线程安全问题)。
  • 系统视角进程是资源分配的最小单位,线程是系统调度的最小单位(调度器更直接"盯着线程跑")。
  • 故障影响 :一个进程挂了通常不影响别的进程;一个线程挂了,可能把同进程的其他线程一起带走(进程崩溃)

4)Java 线程与操作系统线程

线程本质是操作系统概念;Java 的 Thread 类可以看作对 OS 线程 API 的抽象封装 :你在 Java 里 new Thread().start(),底层最终仍要由 OS 创建并调度对应的线程。


Java 线程一共有几种状态?

答案很干脆:6 种 ,由 Thread.State 枚举定义:

  • NEW
  • RUNNABLE
  • BLOCKED
  • WAITING
  • TIMED_WAITING
  • TERMINATED

下面我按"含义 + 典型触发条件"讲清楚。


每种线程状态的含义

1)NEW:刚把人招来,还没让他干活

线程对象创建出来了,但还没调用 start()
典型场景Thread t = new Thread(...); 此时 t.getState() 往往就是 NEW

2)RUNNABLE:可运行(可能正在跑,也可能在就绪队列里排队)

RUNNABLE 不等于"正在执行 CPU 指令",它表示:线程具备运行条件,正等待/参与调度 。实际可以粗分为"ready(就绪)/running(运行中)",但在 Java 状态里统一归到 RUNNABLE

3)BLOCKED:等锁(等进入 synchronized 的那把监视器锁)

当线程尝试进入某个 synchronized 代码块/方法,但锁被其他线程持有 ,就会进入 BLOCKED,在锁的等待队列里排队。

一句话:BLOCKED = 等锁

4)WAITING:无限期地等"通知"

线程主动进入等待,没有超时时间 ,需要其他线程用"通知/结束"等事件把它唤醒。

常见触发:

  • Object.wait()(必须在 synchronized 内调用)
  • Thread.join()(不带超时版本)
    一句话:WAITING = 等通知(没截止时间)

5)TIMED_WAITING:带时限地等

WAITING 类似,但有时间上限 ,时间到会自动醒来(当然也可能被提前通知/中断唤醒)。

常见触发:

  • Thread.sleep(ms)
  • Object.wait(timeout)
  • Thread.join(timeout)
    一句话:TIMED_WAITING = 等通知(有截止时间)

6)TERMINATED:线程生命周期结束

run() 方法执行完毕,或者抛出未捕获异常导致结束。线程"人没了",不会再回到其他状态。


状态之间如何切换:条件一张"文字版状态机"

下面是最常用、最容易考/最容易踩坑的转移路径(我按"从哪来 → 到哪去:触发条件"写):

NEW → RUNNABLE

  • 调用 thread.start():线程被创建并进入可调度状态。

RUNNABLE → TERMINATED

  • run() 正常返回,或抛出未捕获异常。

RUNNABLE → BLOCKED

  • 线程尝试进入 synchronized(同一把锁对象),但锁被占用。

BLOCKED → RUNNABLE

  • 持锁线程退出同步块释放锁;该线程被唤醒并重新参与锁竞争,抢到锁后回到可运行态。

RUNNABLE → WAITING

  • Object.wait():线程进入等待队列,并且释放当前持有的那把锁 (这是 wait 的关键语义)。
  • Thread.join():等待目标线程结束。

WAITING → RUNNABLE

  • 对应对象上发生 notify() / notifyAll()(注意:被唤醒后还要重新竞争锁,未必立刻执行)。
  • 等待线程被 interrupt():可能以标志位/异常形式打断等待流程。
  • join() 场景:被等待的线程运行结束。

RUNNABLE → TIMED_WAITING

  • Thread.sleep(ms):让出 CPU 一段时间(不释放锁)。
  • Object.wait(timeout):带超时的等待(会释放锁)。
  • Thread.join(timeout):带超时等待目标线程结束。

TIMED_WAITING → RUNNABLE

  • 超时时间到自动唤醒;或被 notify/notifyAllinterrupt 提前唤醒(同样可能需要重新竞争锁)。

一个容易记住的对照:BLOCKED vs WAITING/TIMED_WAITING

  • BLOCKED:等锁(进不去 synchronized)
  • WAITING / TIMED_WAITING:等通知(wait/join/sleep 等导致的等待,其中 wait/join 是"等别人",sleep 是"等时间")

总结

进程负责把资源围起来、把故障隔离开;线程负责把代码跑起来、把并发能力榨出来。Java 的线程状态机看似复杂,本质就是围绕三类"等"在打转:等调度(RUNNABLE)、等锁(BLOCKED)、等通知/等时间(WAITING/TIMED_WAITING) ,最后走向 TERMINATED

相关推荐
汪不止21 小时前
使用模板方法模式实现可扩展的动态查询过滤器
java·模板方法模式
Facechat21 小时前
视频混剪-时间轴设计
java·数据库·缓存
qq_4017004121 小时前
QT C++ 好看的连击动画组件
开发语言·c++·qt
t1987512821 小时前
广义预测控制(GPC)实现滞后系统控制 - MATLAB程序
开发语言·matlab
蝎子莱莱爱打怪21 小时前
我的2025年年终总结
java·后端·面试
沛沛老爹21 小时前
Web开发者5分钟上手:Agent Skills环境搭建与基础使用实战
java·人工智能·llm·llama·rag·agent skills
奋进的芋圆21 小时前
TokenRetryHelper 详解与 Spring Boot 迁移方案
java·spring boot·后端
报错小能手21 小时前
线程池学习(六)实现工作窃取线程池(WorkStealingThreadPool)
开发语言·学习
一条咸鱼_SaltyFish21 小时前
[Day10] contract-management初期开发避坑指南:合同模块 DDD 架构规划的教训与调整
开发语言·经验分享·微服务·架构·bug·开源软件·ai编程