java线程有哪些状态:六种状态及切换规则

Java线程共有六种官方定义的线程状态,分别是新建、就绪、运行、阻塞、等待、超时等待,不同状态对应线程不同的执行阶段,且仅能按照固定规则相互切换,该分类严格遵循Oracle官方JDK1.8及以上版本的线程状态定义,是开发调试线程问题的核心判断依据,你可通过Thread.getState()方法直接获取线程实时状态,快速定位线程卡死、卡顿、无响应等常见问题。

Java线程基础状态定义

新建状态(NEW)是线程初始化后的初始状态,仅在代码中创建Thread对象、未调用start()方法时触发。此时仅完成了线程对象的内存分配,操作系统内核并未创建真实线程,虚拟机不会为该线程分配CPU执行资源,线程完全不具备运行能力,且该状态无法直接切换为阻塞、等待等其他状态,只能通过start()方法进入就绪状态。

就绪状态(RUNNABLE)包含系统就绪和等待CPU调度两种子状态,是线程可执行的预备状态。调用线程start()方法后,线程进入该状态,操作系统已完成线程资源初始化,线程具备执行资格。处于该状态的线程,会进入CPU调度队列,等待操作系统分配时间片,获得资源后立即切换为运行状态。Java官方未拆分该状态的子分类,统一归类为RUNNABLE。

运行状态(RUNNING)是线程正在执行代码的唯一状态。就绪状态的线程获取到CPU时间片后进入该状态,线程会逐行执行run()方法中的业务逻辑。CPU时间片耗尽后,线程会主动退回就绪状态,重新参与调度排队,这也是多线程交替执行的核心原理。

阻塞状态(BLOCKED)是线程争抢同步资源失败后的被动暂停状态。仅针对synchronized同步锁场景,当线程尝试获取对象锁失败、锁被其他线程占用时,线程进入阻塞状态。该状态下线程不占用CPU资源,不会参与调度,等待持有锁的线程释放锁后,会自动切换为就绪状态重新争抢资源。

等待状态(WAITING)是线程主动放弃资源的无时限暂停状态。你调用Object.wait()、Thread.join()、LockSupport.park()方法时,线程会进入该状态,无自动唤醒机制,会永久暂停执行。必须依靠其他线程执行唤醒操作,比如调用notify()、notifyAll()方法,线程才能解除等待,切换为就绪状态。

超时等待有固定唤醒时效。

超时等待状态(TIMED_WAITING)是带时间限制的主动等待状态,区别于无时限的WAITING状态。调用Thread.sleep(long)、Object.wait(long)、Thread.join(long)等带超时参数的方法后,线程进入该状态。等待时间结束后线程会自动唤醒,无需其他线程干预,也可被其他线程提前唤醒,唤醒后直接进入就绪状态。

Java线程状态切换核心对比

线程状态触发核心操作自动唤醒能力CPU占用情况
NEW创建Thread对象不占用
RUNNABLE调用start()方法等待CPU调度排队待占用
BLOCKED争抢synchronized锁失败锁释放后自动就绪不占用
WAITING执行无参等待方法无,需手动唤醒不占用
TIMED_WAITING执行带超时等待方法超时后自动唤醒不占用

Java线程不存在官方定义的“死亡状态”,线程执行完run()方法代码或被终止后,会直接销毁资源,不再保留状态标识,开发中切勿自定义该状态用于线程判断,会造成代码逻辑偏差。

所有线程状态的切换均为单向、有固定条件的流转,不存在跨状态跳跃的情况,比如新建状态线程无法直接进入阻塞状态,运行状态线程无法直接进入等待状态,必须遵循既定切换逻辑,这也是线程故障排查的固定判断标准。

敬慕百科汇集百科知识与游戏文化,带你发现世界的每一个精彩角落。

想要了解更多关于java线程有哪些状态的文章欢迎访问:百科