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/notifyAll、interrupt 提前唤醒(同样可能需要重新竞争锁)。

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

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

总结

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

相关推荐
摇滚侠28 分钟前
《On Java 中文版 基础卷》阅读笔记 对象无处不在 03
java·笔记·python
二十雨辰42 分钟前
[学成在线]-01项目背景
java
小小小小钰儿1 小时前
1.5-Python网络编程
开发语言·网络·python·web安全·计算机·网络安全
hiahiahia1231 小时前
实现完整 Tool Dispatcher
开发语言·前端
AC赳赳老秦1 小时前
公开音频转写信息提取:OpenClaw 处理发布会与听证会文本并提取核心决策信息
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
弈栈录2 小时前
Java AI 应用的异步化与高并发设计
java·后端·架构
@yanyu6662 小时前
C编译器安装与第一个C程序
c语言·开发语言
落魄实习生2 小时前
Agent Scope Java 2.x 系列【2】 ReActAgent
java·开发语言
智鸟科技GemeOpen开发者智能设备2 小时前
智能插座二次开发如何接入Home Assistant,从零开始完整工程实现(Python+React)
开发语言·python·物联网·react.js·智能家居