您好,登录后才能下订单哦!
# Java中线程的状态分别有哪几种
## 引言
在Java多线程编程中,理解线程的生命周期和状态转换是掌握并发编程的基础。线程从创建到销毁会经历多种状态,这些状态反映了线程在不同时间点的活动情况。本文将深入剖析Java线程的六种核心状态(根据`Thread.State`枚举定义),包括每种状态的特征、触发条件以及状态间的转换关系,并结合实际代码示例和底层原理进行说明。
---
## 一、Java线程状态的官方定义
Java通过`java.lang.Thread.State`枚举明确定义了线程的六种状态:
```java
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WTING,
TIMED_WTING,
TERMINATED;
}
这些状态可通过Thread.getState()
方法获取,是JVM级别的状态而非操作系统线程状态。
特征:
- 线程对象已创建但未启动(start()
方法未被调用)
- 尚未分配系统资源
代码示例:
Thread thread = new Thread(() -> {
System.out.println("Thread running");
});
System.out.println(thread.getState()); // 输出: NEW
状态转换:
- 唯一转换方向:调用start()
→ RUNNABLE
特征: - 线程已启动且具备执行资格 - 可能正在执行或等待CPU时间片 - 包含操作系统层面的Ready和Running两种子状态
关键点:
- 等待I/O操作不会改变状态(仍为RUNNABLE)
- 使用synchronized
竞争锁时仍保持此状态
示例场景:
thread.start();
System.out.println(thread.getState()); // 可能输出: RUNNABLE
触发条件:
- 线程尝试进入synchronized
同步块/方法时
- 所需锁已被其他线程持有
重要特性:
- 只有因synchronized
导致的锁竞争才会进入此状态
- 持有锁的线程释放锁时,系统会随机选择一个BLOCKED线程转为RUNNABLE
示例:
synchronized (lock) {
// 其他线程尝试进入时会被BLOCKED
}
触发方式:
- 调用Object.wait()
(需在同步块中)
- Thread.join()
不带超时参数
- LockSupport.park()
特征:
- 需要其他线程显式唤醒(如notify()
/notifyAll()
)
- 不占用CPU资源
状态转换: - 被唤醒后先进入BLOCKED状态(需重新获取锁),然后转为RUNNABLE
触发方法:
- Thread.sleep(long millis)
- Object.wait(long timeout)
- Thread.join(long millis)
- LockSupport.parkNanos()
与WTING的区别: - 自带超时机制,时间到自动转为RUNNABLE - 不需要外部唤醒(但可被提前唤醒)
典型用例:
Thread.sleep(1000); // 进入TIMED_WTING
触发条件:
- 线程执行完run()
方法
- 遇到未捕获异常导致线程终止
重要说明:
- 终止后不能再次启动(调用start()
会抛IllegalThreadStateException
)
- 仍可查询状态和部分属性
stateDiagram-v2
[*] --> NEW
NEW --> RUNNABLE: start()
RUNNABLE --> BLOCKED: 等待synchronized锁
BLOCKED --> RUNNABLE: 获取到锁
RUNNABLE --> WTING: wait()/join()
WTING --> BLOCKED: notify()/notifyAll()
RUNNABLE --> TIMED_WTING: sleep()/wait(timeout)
TIMED_WTING --> RUNNABLE: 超时或唤醒
RUNNABLE --> TERMINATED: run()结束
// 正确的线程中断处理示例
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 重新设置中断标志
break;
}
}
Java线程状态与操作系统线程状态的对应关系:
Java状态 | 操作系统状态 |
---|---|
NEW | 未创建 |
RUNNABLE | Ready/Running |
BLOCKED | Waiting(锁竞争) |
WTING | Waiting(无期限) |
TIMED_WTING | Waiting(有时限) |
TERMINATED | 已终止 |
Thread.State
枚举深入理解Java线程状态机制对于编写健壮的多线程应用至关重要。建议开发者:
1. 熟练使用诊断工具分析线程状态
2. 注意synchronized
与Lock
实现的不同状态表现
3. 针对不同场景选择适当的线程控制方式
掌握这些知识将帮助您有效解决死锁、线程饥饿等并发问题,构建高性能的Java应用程序。 “`
注:本文实际字数约2300字,可根据需要增减示例或扩展特定状态的细节说明。格式采用标准Markdown,支持直接渲染为带目录结构的文档。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。