您好,登录后才能下订单哦!
# Java线程的生命周期状态有哪些
## 引言
在Java多线程编程中,理解线程的生命周期状态是掌握并发编程的基础。线程从创建到销毁会经历多个状态,每个状态代表了线程在特定时间点的行为特征。本文将深入剖析Java线程的完整生命周期状态,结合源码分析、状态转换条件和实际应用场景,帮助开发者构建系统的线程状态知识体系。
## 一、Java线程状态的定义
Java语言通过`java.lang.Thread.State`枚举类明确定义了线程的六种状态:
```java
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WTING,
TIMED_WTING,
TERMINATED;
}
这些状态在Thread类的源码中有着严格的定义,我们可以通过Thread.getState()
方法获取线程当前的状态。
特征: - 线程对象已创建但尚未启动 - 未调用start()方法前的状态
Thread thread = new Thread(() -> {
// 线程任务代码
});
System.out.println(thread.getState()); // 输出 NEW
注意事项: - 对NEW状态的线程调用start()以外的任何方法都会导致IllegalThreadStateException - 一个线程只能从NEW状态启动一次
特征: - 调用start()方法后进入的状态 - 包括就绪(Ready)和运行中(Running)两种子状态
重要说明: - 处于RUNNABLE状态的线程不一定正在消耗CPU资源 - 在JVM层面可能处于等待操作系统调度的状态
thread.start();
System.out.println(thread.getState()); // 输出 RUNNABLE
操作系统调度影响: - 在单核CPU上,多个RUNNABLE线程会快速切换 - 在多核CPU上,多个RUNNABLE线程可能真正并行执行
触发条件: - 线程尝试进入同步代码块/方法时,锁已被其他线程持有 - 等待获取监视器锁(Monitor Lock)的状态
synchronized (lockObject) {
// 另一个线程在此处被阻塞
}
与WTING的区别: - BLOCKED是被动的等待锁释放 - WTING是主动放弃锁并等待条件
触发方法: - Object.wait() - Thread.join() - LockSupport.park()
特征: - 需要其他线程显式唤醒 - 不参与CPU调度
synchronized (lock) {
lock.wait(); // 进入WTING状态
}
典型场景: - 生产者消费者模式中的缓冲区空/满等待 - 线程间协调工作
触发方法: - Thread.sleep(long) - Object.wait(long) - Thread.join(long) - LockSupport.parkNanos() - LockSupport.parkUntil()
Thread.sleep(1000); // 休眠1秒
与WTING的区别: - 具有明确的超时时间 - 超时后自动返回RUNNABLE状态
特征: - run()方法执行完毕 - 线程生命周期结束
thread.join();
System.out.println(thread.getState()); // 输出 TERMINATED
注意事项: - 终止状态的线程不能再次启动 - 线程对象本身仍可作为普通对象使用
stateDiagram-v2
[*] --> NEW
NEW --> RUNNABLE: start()
RUNNABLE --> TERMINATED: run()完成
RUNNABLE --> BLOCKED: 获取锁失败
BLOCKED --> RUNNABLE: 获取到锁
RUNNABLE --> WTING: wait()/join()/park()
WTING --> RUNNABLE: notify()/unpark()
RUNNABLE --> TIMED_WTING: sleep()/wait(timeout)
TIMED_WTING --> RUNNABLE: 超时/唤醒
NEW → RUNNABLE
RUNNABLE ↔ BLOCKED
RUNNABLE ↔ WTING/TIMED_WTING
Thread thread = new Thread(/*...*/);
Thread.State state = thread.getState();
jstack工具:
jstack <pid>
输出示例:
"main" #1 prio=5 os_prio=0 tid=0x00007f... nid=0x... waiting on condition [...]
JVisualVM:
Arthas:
thread
thread -n 3
thread -b
线程死锁:
线程泄漏:
生产者消费者模式:
synchronized (queue) {
while (queue.isEmpty()) {
queue.wait(); // -> WTING
}
// ...
}
线程池管理:
CompletableFuture.supplyAsync(() -> {
// 任务代码
}).thenAccept(result -> {
// 回调处理
});
Java状态 | 操作系统状态 | 说明 |
---|---|---|
NEW | 未创建 | Java层抽象 |
RUNNABLE | 就绪/运行 | 合并了两种OS状态 |
BLOCKED | 阻塞 | 仅针对监视器锁 |
WTING | 阻塞 | 等待特定条件 |
TIMED_WTING | 阻塞 | 带超时的等待 |
关键差异: - Java将操作系统的运行/就绪合并为RUNNABLE - Java细化了不同类型的等待状态
Java 5之前:
Java 5:
Java 15+:
RUNNABLE误区:
BLOCKED范围:
状态转换不可逆:
状态监控:
资源释放:
try {
// 同步代码
} finally {
// 确保锁释放
}
超时设置:
深入理解Java线程的生命周期状态对于编写健壮的多线程程序至关重要。从NEW到TERMINATED的完整状态流转,反映了线程在JVM中的完整生命周期。掌握这些状态及其转换条件,可以帮助开发者:
随着Java版本的演进,线程状态的实现细节可能会继续优化,但基本的状态模型将保持稳定,成为Java并发编程的基石之一。
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。