面试被追着问的Java多线程生命周期:从青铜到王者,我悟了!

【五分钟面试题】线程的生命周期和状态切换 阅读详情

一开始我觉得这玩意儿不就是那几个状态吗?直到被面试官追问"BLOCKED和WAITING的根本区别是什么?"、"RUNNABLE里藏着哪些性能陷阱?",才意识到自己之前理解的有多肤浅。

今天咱们不照本宣科,从一个实战派的视角,把多线程生命周期的"里里外外"扒个干净——​​不仅要知道六个状态的名字,更要明白它们是怎么"生老病死"的,以及在真实项目中如何利用这些状态解决问题​​。


一、先搞清楚:线程的"身份证"到底有几种状态?

Java线程的生命周期,本质上是Thread.State枚举定义的六个状态(JDK1.5引入)。很多人背过这六个名字:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。但​​真正面试被卡住的,是搞不清状态之间的转换逻辑​​。

我用一张自己画的"状态流转图"帮你理清关系(见下图,建议保存)。记住:线程的状态转换是单向的,就像人生只能从出生到死亡,不能"逆生长"。

https://img-blog.csdnimg.cn/20230920153000123.png


二、逐个拆解:每个状态的"生存法则"和典型场景

1. NEW(新生儿):线程的"胎教"阶段

​​定义​​:线程对象刚被创建(调用了new Thread()),但还没调用start()方法。
​​特点​​:这时候线程只是JVM中的一个对象,操作系统层面根本没分配资源,CPU更不会搭理它。
​​常见误区​​:有人觉得"创建线程=启动线程",结果面试时被问"new Thread后线程处于什么状态?"直接懵。
​​实战场景​​:

Thread thread = new Thread(() -> System.out.println("我是NEW状态")); 
// 此时thread.getState() → NEW

2. RUNNABLE(预备役):线程的"高考冲刺期"

​​定义​​:调用start()后,线程进入RUNNABLE状态。但注意!​​RUNNABLE在JVM中分为两个子状态​​(JDK1.6之后细分):

  • ​​就绪(Ready)​​:线程已准备好,等待CPU调度(比如刚start(),或被yield()让出CPU)。
  • ​​运行中(Running)​​:线程正在CPU上执行run()方法。

​​转换条件​​:

  • 就绪 → 运行中:CPU分配时间片。
  • 运行中 → 就绪:时间片耗尽,或被高优先级线程抢占。
  • 运行中 → BLOCKED/WAITING/TIMED_WAITING:主动让出CPU(比如等待锁、调用wait()/sleep())。

​​血泪教训​​:
很多人用Thread.activeCount()查看活跃线程数时,发现数值不对,就是因为把RUNNABLE的两个子状态混为一谈——​​就绪和运行中的线程都属于RUNNABLE状态​​,但实际占用CPU的只有运行中的那个。

​​实战场景​​:

thread.start(); 
// 此时thread.getState()可能是RUNNABLE(就绪或运行中,取决于CPU调度)

3. BLOCKED(堵车状态):线程的"停车场等待"

​​定义​​:线程因竞争锁失败,被阻塞在synchronized同步块/方法外。
​​转换条件​​:

  • 当持有锁的线程释放锁时,JVM会从等待锁的线程中选一个唤醒(进入RUNNABLE就绪状态)。

​​常见误区​​:
有人觉得"BLOCKED是因为线程执行时间太长",其实它是​​主动/被动等待锁的结果​​。比如两个线程同时抢同一把锁,没抢到的那个就会进入BLOCKED。

​​实战场景​​:

// 线程1:持有锁
new Thread(() -> {
    synchronized (lock) {
        // 执行耗时操作...
    }
}).start();

// 线程2:抢锁失败进入BLOCKED
new Thread(() -> {
    synchronized (lock) { // 这里会阻塞,直到线程1释放锁
        System.out.println("抢到锁了");
    }
}).start();

4. WAITING(干等状态):线程的"望眼欲穿"

​​定义​​:线程因调用wait()、join()或LockSupport.park(),主动放弃CPU并进入等待队列,直到被其他线程唤醒。
​​转换条件​​:

  • 被唤醒(notify()/notifyAll())或被中断(interrupt())。

​​和BLOCKED的本质区别​​:
BLOCKED是"等锁"(被动等待系统分配资源),WAITING是"等事件"(主动等待其他线程通知)。

​​实战翻车现场​​:
我之前在做一个消息队列时,用wait()等待消息,但忘记在放入消息时调用notify(),结果线程一直卡在WAITING状态,日志都查不到原因——​​一定要记得唤醒!​​

​​实战场景​​:

synchronized (obj) {
    obj.wait(); // 进入WAITING状态,释放锁
}
// 被唤醒后重新竞争锁,回到RUNNABLE

5. TIMED_WAITING(限时干等):线程的"闹钟式等待"

​​定义​​:线程因调用sleep(long)、wait(long)、join(long)或LockSupport.parkNanos(),进入带超时的等待状态。
​​转换条件​​:

  • 时间到期自动唤醒(回到RUNNABLE);
  • 提前被唤醒(和WAITING一样)。

​​为什么需要这个状态?​​
防止线程无限等待。比如数据库连接池,如果获取连接超时,就可以用TIMED_WAITING避免线程一直卡住。

​​实战技巧​​:
调试时如果发现大量TIMED_WAITING线程,要检查是否有合理的超时时间设置——比如Thread.sleep(1000)如果设置成0,会直接进入RUNNABLE(但这种情况很少见)。

​​实战场景​​:

// 等待3秒后自动唤醒
Thread.sleep(3000); 
// 或者带超时的wait()
synchronized (obj) {
    obj.wait(3000); 
}

6. TERMINATED(退休状态):线程的"圆满谢幕"

​​定义​​:线程的run()方法执行完毕,或因异常终止。
​​特点​​:

  • 状态一旦进入就无法逆转(不能重启已终止的线程)。
  • JVM会回收线程资源,但操作系统层面的线程可能还没完全销毁(取决于JVM实现)。

​​注意事项​​:
很多人用stop()方法强制终止线程(已被废弃),这会导致资源未释放、数据不一致等问题。正确做法是​​通过标志位控制线程退出​​(比如volatile boolean running)。

​​实战场景​​:

Thread thread = new Thread(() -> {
    try {
        // 执行任务...
    } finally {
        // 清理资源(关闭连接、释放锁等)
    }
});
thread.start();
// 等待任务完成
thread.join(); 
// 此时thread.getState() → TERMINATED

三、面试高频问题:这些坑我帮你踩过了

Q1:RUNNABLE状态包括哪些具体情况?

​​答案​​:包括线程正在CPU上运行(Running)和等待CPU调度(Ready)。JVM层面不区分这两个子状态,但操作系统会管理。

Q2:BLOCKED和WAITING的根本区别是什么?

​​答案​​:BLOCKED是因竞争锁失败而阻塞(被动等待系统释放锁);WAITING是因调用wait()/join()等方法主动放弃CPU,等待其他线程唤醒。

Q3:TIMED_WAITING和WAITING的区别?

​​答案​​:TIMED_WAITING有超时时间,到期自动唤醒;WAITING需要显式唤醒(如notify())。

Q4:线程终止后还能重启吗?

​​答案​​:不能。TERMINATED是终态,重启会抛出IllegalThreadStateException。

Q5:如何避免线程长时间处于WAITING/TIMED_WAITING?

​​答案​​:

  • 检查唤醒条件是否正确(比如notify()是否在正确的位置调用);
  • 设置合理的超时时间(避免无限等待);
  • 使用Lock+Condition替代synchronized,可以更灵活地管理等待队列。

四、总结:生命周期的底层逻辑

线程的生命周期,本质上是​​操作系统对线程资源的管理艺术​​。理解每个状态的转换条件,能帮我们在面试中脱颖而出,更能在实际开发中:

  • 快速定位线程卡住的问题(比如通过jstack看线程状态是WAITING还是BLOCKED);
  • 优化线程池配置(根据任务类型选择是否使用带超时的等待);
  • 避免低级错误(比如忘记唤醒等待线程导致死锁)。
Java后端程序员面临内卷,从没想过内卷这事我会遇到 2021 年的 Java 程序员行业内卷越来越重,面试难度也在不断提升,今年,从 java 转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java 程序员市场需求依然是比较大的,而且 Java 岗位晋升方向多,这就为许多人带去了机会。但是另一方面,高级人才紧缺,很多即使是有工作经验的程序员都达不到大厂招聘的要求,对比阿里,看下你离高级人才还差几步? 一直想整理出一份完美的面试宝典,但是时间上一直腾不开,这套一千多道面试题宝典,结合今年金三银四各种大厂面试题,以及 Gi 阅读详情

相关推荐

PWM(脉宽调制)技术详解:从基础到应用实践示例

PWM(脉宽调制)技术是嵌入式系统中一项重要的控制技术,通过调节脉冲宽度来实现对模拟设备的精准控制。从LED亮度到电机速度,PWM的应用场景非常广泛。对于嵌入式学习者来说,理解PWM的工作原理、掌握其配置方法,不仅能提升编程能力,还能为更多复杂系统的开发打下坚实的基础。

SpringWJN的博客 6334

JAVA基础面试题:Java中的线程状态与生命周期管理

Victor线程的6种状态状态转换逻辑:重点关注RUNNABLE与其他状态的转换条件。状态监控与优化:通过工具监控线程状态,优化系统性能。分布式系统中的应用:任务调度、故障排查和资源分配。Java中的线程状态与生命周期管理是并发编程的基础,深刻理解这些概念能够帮助开发者编写高效、稳定的多线程程序。无论是面试还是实际开发,这些知识点都至关重要。

qq_61302385的博客 582

FR4板材实战:用ADS 2023快速设计微带线低通滤波器(附Line-Cal计算技巧)

本文详细介绍了使用ADS 2023在FR4板材上设计1-3GHz微带线低通滤波器的工程技巧。通过Line-Cal工具快速计算微带线参数,解决FR4板材的介质损耗和阻抗匹配问题,提供从集总参数转换到分布参数的实用方法,并分享版图设计与实测验证的关键要点,帮助工程师高效完成射频滤波器设计。

omega的博客 714

经典面试问题:线程的生命周期

线程生命周期就是从线程创建到线程终止过程中线程的几种状态切换。线程状态分为五种,分别是新建状态,就绪状态,运行状态,阻塞状态和终止状态。

qq_74011163的博客 604

AI大模型探索之路-认知篇1-全景透视:揭秘AIGC技术的进化之路

随着人工智能技术的突飞猛进,内容创作方式的发生了革命性的转变;从早期专业人员主导的内容生产,到现如今生成式人工智(AIGC)能创作时代;本篇文章主要讲解AIGC技术的演变历程。

寻道AI,探索AI无限可能! 1651

基于PyQt5和OpenCV的传统图像分割应用UI程序

主要功能包括:加载和显示图像应用多种图像分割算法调整算法参数保存处理结果。

Henry的博客 474

线程的生命周期(面试前必看!!)

线程从创建并启动到消亡共经历了5种状态:新建、就绪、运行、阻塞和死亡新创建了一个线程对象。线程对象创建后,其它线程调用了该对象的start()方法。只能针对处于新建状态的线程对象调用start方法,否则IllegalThreadStateException该状态的线程位于可执行线程池中,变得可执行,等待获取CPU的使用权。就绪状态的线程获取了CPU,执行程序代码run()。注意在一个多处理器的机器上会有多个线程并行执行。

m0_55887994的博客 1108

2025年华为杯中国研究生数学建模竞赛C题 围岩裂隙精准识别与三维模型重构 思路+代码

report += f"**位置 {i+1}**: ({loc[0]:.1f}, {loc[1]:.1f}, {loc[2]:.1f})\n"# ==================== 高级U-Net模型 ====================# ==================== 数据预处理与增强 ====================# ==================== 采样方法比较分析 ====================

YOLO 1528

Java面试--线程的生命周期状态

线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。  具体的运行过程如下:  1、通过new关键字创建后,进入到新生状态  2、调用start后进入就绪状态  3、CPU调度到本线程后,本线程开始执行。进入到运行状态  4、运行中遇到join,yield,sleep造成阻塞,进入阻塞状态。阻塞完成后,又回到就绪状态  5、线程正常执行完,或者遇到异常...

过往很淡的博客 245

UMI——斯坦福刷盘机器人:通过手持夹爪革新数据收集方式,且使用视觉SLAM和Diffusion Policy预测动作

没想到今年年初的斯坦福mobilealoha的热度刚过,而到今年2月的下旬,斯坦福另一个团队又推出了UMI刷盘机器人,且这两个团队还互相认识、还在一块共同切磋(顺带小小感叹一下,斯坦福的氛围是真好而且真高产)斯坦福UMI刷盘机器人其与mobile aloha(以及AirExo: Low-Cost Exoskeletons for Learning Whole-Arm Manipulation in the Wild)最大的不同在于其收集数据处理的非真实的机器人,而是一个手持夹持器(从而大幅降低成本)

u013250861的博客 1357

5G无人机安全研究综述

国内多所高校提出混合信任模型,南京航空航天大学于2020年提出了起源信息感知的无人机网络信任模型[26],模型基于报文的完整性对报文创建和操作节点的行为评判并生成观测证据,收集证据进行信任评估,识别网络中的恶意节点并进行路由隔离,实现准确的对等信任评估。同时,5G技术的高速率、高可靠性、低时延等特点,能够为无人机提供实时高清图像回传,保证通信网络的稳定,拓展无人机飞控距离限制,丰富了5G无人机的应用场景。5G和无人机技术的融合,丰富了传统无人机的应用服务场景,然而5G无人机仍存在安全隐患。

weixin_70923796的博客 767

Java多线程入门指南:从青铜到王者的必经之路(附高频面试题)

Compare And Swap的缩写,乐观锁的实现原理。典型应用:AtomicInteger的incrementAndGet()方法。存在ABA问题,可通过版本号解决。VisualVM:监控线程状态Arthas:在线诊断工具IDEA的Debug模式:可以暂停指定线程建议大家自己动手写个生产者-消费者模型,把学到的知识都串起来。遇到问题不要方,多看看源码和官方文档,你会发现Java并发包的设计真的精妙!

2501_91408482的博客 753

把 NAST 变成你的遥控器:用 ABAP 程序精确触发与处理 Output Type

摘要 SAP中的Message Control机制通过NAST表记录输出状态,支持自动触发打印、邮件等操作。关键步骤包括: 构造NAST记录:定义输出类型、介质、处理状态等参数 调用处理函数:使用RV_MESSAGE_UPDATE_SINGLE更新表,通过WFMC_MESSAGES_PROCESS执行输出 典型应用场景: 单据补发(如PO邮件重发) 外部系统集成触发输出 故障恢复处理积压消息 注意事项: 需提交事务确保更新生效 区分S/4HANA新旧输出体系 正确处理派发时间(VSZTP)和状态(VSTAT

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 261

从青铜到王者的路线,java小游戏毕业论文

Redis 什么是Redis? Redis的数据类型? 使用Redis有哪些好处? Redis相比Memcached有哪些优势? Memcache与Redis的区别都有哪些? Redis是单进程单线程的? 一个字符串类型的值能存储最大容量是多少? Redis的持久化机制是什么?各自的优缺点? Redis常见性能问题和解决方案: redis过期键的删除策略? Redis的回收策略(淘汰策略) ? 为什么Redis需要把所有数据放到内存中? Redis的同步机制了解么? Pipeline有什么好处,为什么要用

m0_56255097的博客 121

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

把最新JAVA面试真题(阿里/京东/菜鸟)整理出来,却被自己菜哭了

前言 2020终于迎来了最后的两个月,这一年,全世界都不安定,被疫情包围,渐渐治愈和免疫,国内虽然看着和往常没有多大的区别,但对于经济的冲击,不知道又倒退了多少年?大大小小的公司面临倒闭或已破产,对于职场上的我们而言,无疑是致命的打击,好了,回到主题,作为JAVA博主,看下JAVA近况~ 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会。但是另一方面,高级人才紧缺,很

qwe123147369的博客 1376

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

从青铜到王者的路线,从新手到Flutter架构师,一篇就够!Android校招面试指南

什么是Kotlin? Kotlin,如前面所说,它是JetBrains开发的基于JVM的语言。JetBrains因为创造了一个强大的Java开发IDE被大家所熟知。Android Studio,官方的Android IDE,就是基于Intellij,作为一个该平台的插件。 Kotlin是使用Java开发者的思维被创建的,Intellij作为它主要的开发IDE。对于Android开发者,有两个有趣的特点: 对Java开发者来说,Kotlin是非常直觉化的,并且非常容易学习。语言的大部分内容都是与我们知道的非常

minhgalaxy的博客 177

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

真实!对比(阿里/京东等一线大厂)Java面试真题,自己把自己菜哭了

前言 2020年,全世界都不安定,被疫情包围,渐渐治愈和免疫,国内虽然看着和往常没有多大的区别,但对于经济的冲击,不知道又倒退了多少年?大大小小的公司面临倒闭或已破产,对于职场上的我们而言,无疑是致命的打击,好了,回到主题,作为JAVA博主,看下JAVA近况~ 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会。但是另一方面,高级人才紧缺,很多即使是有工作经验的程序

一入Java深似海 386

Alibaba【Java岗】P5-P8级别“有史以来”最新最全面试真题:JVM+数据库+spring+数据结构+多线程+网络

前言 2020终于迎来了最后的两个月,这一年,全世界都不安定,被疫情包围,渐渐治愈和免疫,国内虽然看着和往常没有多大的区别,但对于经济的冲击,不知道又倒退了多少年?大大小小的公司面临倒闭或已破产,对于职场上的我们而言,无疑是致命的打击,好了,回到主题,作为JAVA博主,看下JAVA近况~ 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会。但是另一方面,高级人才紧缺

m0_50180963的博客 1862

对比(阿里 / 京东等一线大厂)Java 面试真题,自己把自己菜哭了

人人都有大厂梦,对于程序员来说,BAT 为首的一线互联网公司肯定是自己的心仪对象,毕竟能到这些大厂工作,不仅薪资高待遇好,而且能力技术都能够得到提升,最关键的是还能够给自己镀上一层金,让人瞻仰。今年,从 java 转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java 程序员市场需求依然是比较大的,而且 Java 岗位晋升方向多,这就为许多人带去了机会。

m0_69632475的博客 916

最新整理JAVA面试真题(阿里/百度/蚂蚁)带你吊打面试官

前言 2020终于迎来了最后的两个月,这一年,全世界都不安定,被疫情包围,渐渐治愈和免疫,国内虽然看着和往常没有多大的区别,但对于经济的冲击,不知道又倒退了多少年?大大小小的公司面临倒闭或已破产,对于职场上的我们而言,无疑是致命的打击,好了,回到主题,作为JAVA博主,看下JAVA近况~ 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会。但是另一方面,高级人才紧缺

bieber007的博客 178

对比阿里,你离高级人才还差多少?阿里2020年面试真题一览!

前言 2020终于迎来了最后的两个月,这一年,全世界都不安定,被疫情包围,渐渐治愈和免疫,国内虽然看着和往常没有多大的区别,但对于经济的冲击,不知道又倒退了多少年?大大小小的公司面临倒闭或已破产,对于职场上的我们而言,无疑是致命的打击,好了,回到主题,作为JAVA博主,看下JAVA近况~ 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会。但是另一方面,高级人才紧缺

Java圈全能架构师的博客 350

一位入职蚂蚁金服,年薪 180 万的大佬扔给我的笔记,看完发现差距不止一点点!

前言 2020 终于迎来了最后的一个月,这一年,全世界都不安定,被疫情包围,渐渐治愈和免疫,国内虽然看着和往常没有多大的区别,但对于经济的冲击,不知道又倒退了多少年?大大小小的公司面临倒闭或已破产,对于职场上的我们而言,无疑是致命的打击,好了,回到主题,作为 JAVA 博主,看下 JAVA 近况~ 今年,从 java 转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java 程序员市场需求依然是比较大的,而且 Java 岗位晋升方向多,这就为许多人带去了机会。但是另

Java_may的博客 4286

大厂Java后端高频面试题汇总(2026最新版,附考点解析)

今年,从 java 转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java 程序员市场需求依然是比较大的,而且 Java 岗位晋升方向多,这就为许多人带去了机会。但是另一方面,高级人才紧缺,很多即使是有工作经验的程序员都达不到大厂招聘的要求,对比阿里,看下你离高级人才还差几步?

sjkflw121150的博客 246

熬了36小时,把最新JAVA面试真题(阿里/京东/菜鸟)整理出来,却被自己菜哭了

前言 2020终于迎来了最后的两个月,这一年,全世界都不安定,被疫情包围,渐渐治愈和免疫,国内虽然看着和往常没有多大的区别,但对于经济的冲击,不知道又倒退了多少年?大大小小的公司面临倒闭或已破产,对于职场上的我们而言,无疑是致命的打击,好了,回到主题,作为JAVA博主,看下JAVA近况~ 今年,从java转到别的行业的人不少,也有不少人挤进这个市场想要分得一杯羹。年复一年,年年如此。当然,Java程序员市场需求依然是比较大的,而且Java岗位晋升方向多,这就为许多人带去了机会。但是另一方面,高级人才紧缺,很

doubututou的博客 169
上一篇: 面试必问的Java集合:从源码到实践,那些你未必说清的底层逻辑
下一篇: 面试官如何从面试过程判断你的Java技术深度?
码里看花‌
博客等级 码龄8年 321粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码里看花‌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值