【面试专栏|Java并发编程】拆解Java线程生命周期:从新建到终止,再讲清进程与线程的核心差异

📅 发布时间:2026/7/7 23:21:56 👁️ 浏览次数:
【面试专栏|Java并发编程】拆解Java线程生命周期:从新建到终止,再讲清进程与线程的核心差异
予枫个人主页 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》《Java 面试刷题指南》 Debug 这个世界Return 更好的自己引言面试中被问“进程与线程的区别”你还在翻书找答案Java线程的生命周期从新建到终止的6个状态你能说清每个状态的切换条件吗本文从底层逻辑拆解进程与线程的核心差异结合Java实战讲透线程生命周期附面试官高频追问帮你面试不慌、工作不踩坑建议收藏备用文章目录引言一、先搞懂进程与线程的核心区别面试必答1.1 核心定义通俗版1.2 核心区别对比表一目了然1.3 底层逻辑补充加分项1.4 面试官追问环节高频追问1为什么Java中线程切换比进程切换开销小追问2进程和线程的关系用一个生活例子说明二、Java中线程的完整生命周期6个状态必背2.1 线程生命周期的6个状态Java官方定义2.2 各状态详解结合场景好记不混2.2.1 新建态NEW2.2.2 就绪态RUNNABLE2.2.3 阻塞态BLOCKED2.2.4 等待态WAITING2.2.5 超时等待态TIMED_WAITING2.2.6 终止态TERMINATED2.4 面试官追问环节高频追问1Java中BLOCKED和WAITING的区别是什么追问2sleep()和wait()的区别面试常考追问3线程进入TERMINATED状态后还能调用start()方法重启吗三、总结面试速记一、先搞懂进程与线程的核心区别面试必答进程和线程是操作系统中的核心概念也是Java面试的高频考点很多人只记表面区别却答不出底层逻辑今天一次性讲透让你既能应付面试也能理解实际应用场景。1.1 核心定义通俗版进程操作系统进行资源分配和调度的基本单位相当于一个“独立的应用程序”比如你打开的微信、IDEA、浏览器每个都是一个进程。线程进程内的执行单元是CPU调度和执行的基本单位一个进程可以包含多个线程比如微信同时接收消息、发送文件、刷新朋友圈就是多个线程在协同工作。简单来说进程是“容器”线程是“容器里的干活的人”一个容器里可以有多个干活的人他们共享容器的资源却各自独立执行自己的任务。1.2 核心区别对比表一目了然对比维度进程线程资源分配独立分配内存、CPU、文件句柄等共享所属进程的资源调度单位操作系统调度的基本单位CPU调度和执行的基本单位独立性高一个进程崩溃不影响其他进程低一个线程崩溃可能导致整个进程崩溃切换开销大需切换进程上下文消耗资源多小共享进程资源切换上下文快通信方式复杂需通过管道、消息队列等简单可直接共享进程内的内存面试小贴士回答区别时不要只念表格重点突出“资源分配”和“调度单位”两个核心维度再补充独立性和切换开销面试官会更认可1.3 底层逻辑补充加分项进程之间是“隔离”的每个进程都有自己独立的地址空间操作系统会为每个进程分配独立的资源因此进程之间的通信需要借助外部机制而线程属于同一个进程共享进程的地址空间和资源线程之间的通信只需操作共享内存效率更高。比如打开两个IDEA两个进程它们的内存是独立的一个崩溃不会影响另一个但同一个IDEA里的多个线程比如代码编译、自动保存、语法检查如果其中一个线程崩溃整个IDEA可能会卡死。1.4 面试官追问环节高频追问1为什么Java中线程切换比进程切换开销小答因为线程共享所属进程的地址空间和资源切换线程时只需切换线程的上下文如程序计数器、寄存器、栈指针无需切换进程的地址空间和资源而进程切换需要保存当前进程的所有资源状态加载新进程的资源状态消耗大量CPU和内存资源因此开销更大。追问2进程和线程的关系用一个生活例子说明答比如一家餐厅进程餐厅有自己的场地、食材、设备资源餐厅里的厨师、服务员线程他们共享餐厅的资源各自完成自己的任务厨师做饭、服务员上菜一个厨师出错线程崩溃可能影响餐厅正常运营进程异常但其他餐厅其他进程不受影响。二、Java中线程的完整生命周期6个状态必背Java中的线程生命周期是面试中仅次于“进程与线程区别”的高频考点很多人会混淆“阻塞态”和“等待态”今天结合Java源码和实际场景讲清每个状态的含义、切换条件和应用场景。2.1 线程生命周期的6个状态Java官方定义Java线程的生命周期分为6个状态定义在java.lang.Thread.State枚举中每个状态对应不同的执行阶段具体如下publicenumState{// 新建态线程刚被创建尚未启动NEW,// 就绪态线程已启动等待CPU调度具备执行条件RUNNABLE,// 阻塞态线程等待锁暂时无法执行如synchronized未获取到锁BLOCKED,// 等待态线程主动等待需被其他线程唤醒无超时时间WAITING,// 超时等待态线程等待指定时间超时自动唤醒TIMED_WAITING,// 终止态线程执行完毕或异常终止生命周期结束TERMINATED}2.2 各状态详解结合场景好记不混2.2.1 新建态NEW含义当我们创建Thread对象如new Thread()但未调用start()方法时线程处于新建态。特点此时线程尚未分配CPU资源也未执行任何代码只是一个“对象实例”。示例// 新建态线程ThreadthreadnewThread(()-{System.out.println(线程执行);});// 此时thread.getState() 结果为 NEW2.2.2 就绪态RUNNABLE含义调用start()方法后线程进入就绪态此时线程具备执行条件等待CPU调度。特点线程已经准备好执行只是等待CPU分配时间片一旦获得CPU就会进入运行状态属于RUNNABLE的子集。注意Java中没有单独的“运行态”运行态是就绪态的一种表现形式当CPU调度到该线程时线程开始执行run()方法。2.2.3 阻塞态BLOCKED含义线程在获取锁如synchronized锁时若锁被其他线程持有线程会进入阻塞态直到获取到锁才会重新进入就绪态。场景多线程竞争synchronized锁时未获取到锁的线程会进入阻塞态。示例// 定义一个锁对象ObjectlocknewObject();// 线程1持有锁Threadthread1newThread(()-{synchronized(lock){try{Thread.sleep(10000);// 持有锁10秒}catch(InterruptedExceptione){e.printStackTrace();}}});// 线程2尝试获取锁会进入BLOCKED态Threadthread2newThread(()-{synchronized(lock){System.out.println(线程2获取到锁);}});thread1.start();thread2.start();// 此时thread2.getState() 结果为 BLOCKED2.2.4 等待态WAITING含义线程主动调用wait()方法无超时参数会进入等待态此时线程会释放持有的锁需等待其他线程调用notify()或notifyAll()方法唤醒才能重新进入就绪态。特点无超时时间若没有其他线程唤醒会一直等待死等。示例ThreadthreadnewThread(()-{synchronized(lock){try{lock.wait();// 主动进入等待态释放锁}catch(InterruptedExceptione){e.printStackTrace();}}});2.2.5 超时等待态TIMED_WAITING含义线程调用wait(long timeout)、sleep(long millis)、join(long millis)等带超时参数的方法会进入超时等待态等待指定时间后自动唤醒并进入就绪态也可以被其他线程提前唤醒。特点有超时时间即使没有被唤醒超时后也会自动恢复就绪态避免死等。示例ThreadthreadnewThread(()-{try{Thread.sleep(5000);// 超时等待5秒5秒后自动唤醒}catch(InterruptedExceptione){e.printStackTrace();}});2.2.6 终止态TERMINATED含义线程执行完run()方法或因异常如NullPointerException终止进入终止态生命周期结束。特点线程一旦进入终止态无法再被启动调用start()方法会抛出IllegalThreadStateException。示例ThreadthreadnewThread(()-{System.out.println(线程执行完毕);});thread.start();// 线程执行完run()方法后getState() 结果为 TERMINATED2.4 面试官追问环节高频追问1Java中BLOCKED和WAITING的区别是什么答核心区别是是否释放锁和唤醒条件阻塞态BLOCKED线程因竞争锁失败进入不释放已持有的锁等待锁被释放后自动唤醒无需其他线程主动唤醒等待态WAITING线程主动调用wait()方法进入会释放持有的锁必须等待其他线程调用notify()或notifyAll()唤醒否则会一直等待。追问2sleep()和wait()的区别面试常考答3个核心区别记牢不踩坑所属类不同sleep()是Thread类的静态方法wait()是Object类的方法锁的释放sleep()不会释放锁wait()会释放持有的锁唤醒方式sleep()超时后自动唤醒wait()需被其他线程唤醒无超时或超时唤醒有超时参数。追问3线程进入TERMINATED状态后还能调用start()方法重启吗答不能。线程一旦进入终止态其生命周期就已结束此时调用start()方法会抛出IllegalThreadStateException异常因为线程的状态无法从TERMINATED回到新建态或就绪态。三、总结面试速记进程与线程核心区别进程是资源分配单位线程是CPU调度单位线程共享进程资源切换开销小独立性低。Java线程生命周期6个状态新建NEW→ 就绪RUNNABLE→ 阻塞/等待/超时等待 → 终止TERMINATED重点区分BLOCKED和WAITING的差异。面试加分项掌握面试官高频追问如sleep与wait区别、线程状态切换条件结合代码示例回答更具说服力。建议收藏本文面试前快速过一遍轻松应对进程与线程相关考题 结尾互动如果觉得本文对你有帮助欢迎点赞、收藏、评论区留言讨论你还想了解Java多线程的哪些知识点比如线程池、synchronized锁机制评论区告诉我下期安排