Java线程的生命周期

本文详细介绍了Java线程的五种状态:新生、就绪、运行、阻塞和死亡,包括状态转换及各自特点。线程通过start()进入就绪状态,由系统调度进入运行,可能因阻塞如sleep()或等待I/O进入阻塞,完成任务或异常则进入死亡状态。

线程的状态
▪ 新生状态
– 用new关键字建立一个线程后,该线程对象就处亍新生状态。
– 处亍新生状态的线程有自己的内存空间,通过调用start()方法迚入就绪状态。
▪ 就绪状态
– 处亍就绪状态线程具备了运行条件,但还没分配到CPU,处亍线程就绪队列,等待系统为其分
配CPU。
– 当系统选定一个等待执行的线程后,它就会从就绪状态迚入执行状态,该动作称为“CPU调
度”。
▪ 运行状态
– 在运行状态的线程执行自己的run方法中代码,直到等待某资源而阻塞戒完成任何而死亡。
– 如果在给定的时间片内没有执行结束,就会被系统给换下来回到等待执行状态。
▪ 阻塞状态
– 处亍运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,戒等待I/O设备等资源,将让
出CPU并暂时停止自己运行,迚入阻塞状态。
– 在阻塞状态的线程丌能迚入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,戒等
待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从
原来停止的位置开始继续执行。
▪ 死亡状态
– 死亡状态是线程生命周期中的最后一个阶段。线程死亡的原因有三个,一个是正常运行
的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过stop方法来终止一个
线程【不推荐使用】;三是线程抛出未捕获的异常。

 

<think>好的,用户想了解Java线程生命周期。我得先回忆一下线程的几个状态,然后按照Java的版本变化来梳理清楚。首先,线程生命周期Java的不同版本中可能有所不同,特别是在Java 5之后引入了新的状态,比如TIMED_WAITING。 我记得线程的状态定义在Thread类的内部枚举State里,包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。需要确认每个状态之间的转换条件,比如线程如何从NEW到RUNNABLE,或者从RUNNABLE到BLOCKED等。 接下来要考虑用户可能的背景。他们可能是刚开始学习多线程的开发者,或者是遇到线程状态相关的问题需要调试。因此,解释需要清晰,结构分明,可能还需要举例说明每个状态对应的场景。 需要确保覆盖所有状态,并正确描述触发状态转换的方法,比如start()、wait()、join()、sleep()等。同时要注意区分BLOCKED和WAITING状态的不同,因为这是常见的混淆点。BLOCKED通常是因为等待获取监视器锁,而WAITING是主动调用了等待方法。 另外,要考虑用户可能对状态转换图感兴趣,但无法在这里画图,所以需要用文字描述各个转换路径。比如,当线程调用Object.wait()时会进入WAITING,而带有超时的等待则进入TIMED_WAITING。 还要检查是否有最新的Java版本引入了新的状态,目前到Java 17为止,State枚举还是那六个状态,没有变化。需要确保信息准确,避免过时的内容。 最后,组织回答的结构,先概述生命周期中的各个状态,再逐一详细解释每个状态的定义和触发条件,最后总结状态转换的流程。这样用户能够逐步理解线程在不同阶段的行为,以及如何通过代码控制线程状态的变化。</think>Java线程生命周期线程从创建到销毁的过程,包含6个明确的状态。以下是详细说明: --- ### **1. NEW(新建)** - **定义**:通过`new Thread()`实例化后,尚未调用`start()`方法 - **特征**$$ \text{Thread thread = new Thread();} $$ 此时线程对象已创建,但未分配系统资源 --- ### **2. RUNNABLE(可运行)** - **触发条件**:调用`start()`方法后 - **包含两个子状态**: - **Ready**:等待CPU时间片 - **Running**:正在执行`run()`方法 - **注意**:此状态对应操作系统层面的"就绪"和"运行中" --- ### **3. BLOCKED(阻塞)** - **触发条件**: - 等待进入`synchronized`同步代码块/方法 - 等待其他线程释放对象锁 - **退出条件**:成功获取对象监视器(锁) --- ### **4. WAITING(无限等待)** - **触发方法**: ```java Object.wait() // 无参 Thread.join() // 无参 LockSupport.park() ``` - **特征**:需要其他线程显式唤醒 $$ \text{notify()/notifyAll()} \Rightarrow \text{WAITING} \rightarrow \text{RUNNABLE} $$ --- ### **5. TIMED_WAITING(限期等待)** - **触发方法**: ```java Thread.sleep(long) Object.wait(long) Thread.join(long) LockSupport.parkNanos(long) ``` - **特征**:设定超时时间后自动恢复 $$ \text{自动恢复时间} = \text{MAX}( \text{参数值}, \text{系统时钟精度} ) $$ --- ### **6. TERMINATED(终止)** - **触发条件**: - `run()`方法正常执行结束 - 线程抛出未捕获异常 - **特征**:线程对象仍存在,但不能再调用`start()` --- ### **状态转换流程** ``` NEW → start() → RUNNABLE RUNNABLE → 同步锁竞争 → BLOCKED RUNNABLE → wait()/join() → WAITING RUNNABLE → sleep(n)/wait(n) → TIMED_WAITING 上述状态 → 条件达成 → RUNNABLE 任何状态 → run()结束 → TERMINATED ``` --- ### **验证方法** 通过`Thread.getState()`可获取当前状态: ```java Thread thread = new Thread(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); System.out.println(thread.getState()); // 输出 NEW thread.start(); System.out.println(thread.getState()); // 输出 RUNNABLE 或 TIMED_WAITING ``` 理解线程状态对调试多线程程序至关重要,建议结合`jstack`工具分析实际运行时的线程状态。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值