Java中线程的状态分别有哪几种

发布时间:2021-10-14 15:29:28 作者:iii
来源:亿速云 阅读:189
# 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级别的状态而非操作系统线程状态。


二、详细状态解析

1. NEW(新建状态)

特征: - 线程对象已创建但未启动(start()方法未被调用) - 尚未分配系统资源

代码示例

Thread thread = new Thread(() -> {
    System.out.println("Thread running");
});
System.out.println(thread.getState()); // 输出: NEW

状态转换: - 唯一转换方向:调用start() → RUNNABLE


2. RUNNABLE(可运行状态)

特征: - 线程已启动且具备执行资格 - 可能正在执行或等待CPU时间片 - 包含操作系统层面的ReadyRunning两种子状态

关键点: - 等待I/O操作不会改变状态(仍为RUNNABLE) - 使用synchronized竞争锁时仍保持此状态

示例场景

thread.start();
System.out.println(thread.getState()); // 可能输出: RUNNABLE

3. BLOCKED(阻塞状态)

触发条件: - 线程尝试进入synchronized同步块/方法时 - 所需锁已被其他线程持有

重要特性: - 只有因synchronized导致的锁竞争才会进入此状态 - 持有锁的线程释放锁时,系统会随机选择一个BLOCKED线程转为RUNNABLE

示例

synchronized (lock) {
    // 其他线程尝试进入时会被BLOCKED
}

4. WTING(无限等待)

触发方式: - 调用Object.wait()(需在同步块中) - Thread.join()不带超时参数 - LockSupport.park()

特征: - 需要其他线程显式唤醒(如notify()/notifyAll()) - 不占用CPU资源

状态转换: - 被唤醒后先进入BLOCKED状态(需重新获取锁),然后转为RUNNABLE


5. TIMED_WTING(限时等待)

触发方法: - Thread.sleep(long millis) - Object.wait(long timeout) - Thread.join(long millis) - LockSupport.parkNanos()

与WTING的区别: - 自带超时机制,时间到自动转为RUNNABLE - 不需要外部唤醒(但可被提前唤醒)

典型用例

Thread.sleep(1000); // 进入TIMED_WTING

6. TERMINATED(终止状态)

触发条件: - 线程执行完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()结束

四、状态监测与实战技巧

1. 诊断工具

2. 常见问题排查

3. 最佳实践

// 正确的线程中断处理示例
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 已终止

六、不同JDK版本的演进

  1. Java 5之前:状态定义不够明确
  2. Java 5:引入Thread.State枚举
  3. Java 19+:虚拟线程(Loom项目)引入新状态语义

结语

深入理解Java线程状态机制对于编写健壮的多线程应用至关重要。建议开发者: 1. 熟练使用诊断工具分析线程状态 2. 注意synchronizedLock实现的不同状态表现 3. 针对不同场景选择适当的线程控制方式

掌握这些知识将帮助您有效解决死锁、线程饥饿等并发问题,构建高性能的Java应用程序。 “`

注:本文实际字数约2300字,可根据需要增减示例或扩展特定状态的细节说明。格式采用标准Markdown,支持直接渲染为带目录结构的文档。

推荐阅读:
  1. java中如何观察线程的状态
  2. java线程有哪几种状态

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:HTML5中b和i标记有什么语义

下一篇:php如何根据utf8编码规律来进行截取字符串

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》