千家信息网

Java线程的生命周期状态有哪些

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"Java线程的生命周期状态有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java线程的生命周期状态有哪些"吧!在 Java
千家信息网最后更新 2026年11月02日Java线程的生命周期状态有哪些

这篇文章主要讲解了"Java线程的生命周期状态有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java线程的生命周期状态有哪些"吧!

在 Java 中线程的生命周期中一共有 6 种状态。

  • New(新创建)

  • Runnable(可运行)

  • Blocked(被阻塞)

  • Waiting(等待)

  • Timed Waiting(计时等待)

  • Terminated(被终止)

如果想要确定线程当前的状态,可以通过 getState() 方法,并且线程在任何时刻只可能处于 1 种状态。

一:线程的六种状态

1.1:New 新建

New 表示线程被创建但尚未启动的状态:当我们用 new Thread() 新建一个线程时,如果线程没有开始运行 start() 方法,那么此时它的状态就是 New。

1.2:Runable 可运行

一旦线程调用了 start(),它的状态就会从 New 变成 Runnable。

1.3:阻塞状态

Java 中阻塞状态通常不仅仅是 Blocked,实际上它包括三种状态,分别是 Blocked(被阻塞)、Waiting(等待)、Timed Waiting(计时等待),这三 种状态统称为阻塞状态

1.3.1:Blocked 被阻塞

从 Runnable 状态进入 Blocked 状态只有一种可能,就是进入 synchronized 保护的代码时没有抢到 monitor 锁。当处于 Blocked 的线程抢到 monitor 锁,就会从 Blocked 状态回到Runnable 状态。

1.3.2:waiting 等待

  1. 让线程从Runable 进入 Waiting 状态有三种方法:

  • 没有设置 Timeout 参数的 Object.wait() 方法。

  • 没有设置 Timeout 参数的 Thread.join() 方法。

  • LockSupport.park() 方法。

前面的Blocked(被阻塞状态) 仅仅针对 synchronized monitor 锁,可是在 Java 中还有很多其他的锁,比如 ReentrantLock,如果线程在获取这种锁时没有抢到该锁就会进入 Waiting 状态,因为本质上它执行了 LockSupport.park() 方法,所以会进入 Waiting 状态。

  1. 让线程从 Waiting 状态进入 Runable状态的情况:

Waiting 是不限时的,也就是说无论过了多长时间它都不会主动恢复。只有当执行了 LockSupport.unpark(),或者 join 的线程运行结束,或者被中断时才可以进入 Runnable 状态。

  1. 让线程从 Waiting 状态进入 Blocked状态的情况:

当其他线程调用 notify() 或 notifyAll()来唤醒它,它会直接进入 Blocked 状态。因为唤醒 Waiting 线程的线程如果调用 notify() 或 notifyAll(),要求必须首先持有该 monitor 锁,所以处于 Waiting 状态的线程被唤醒时拿不到该锁,就会进入 Blocked 状态,直到执行了 notify()/notifyAll() 的唤醒它的线程执行完毕并释放 monitor 锁,才可能轮到它去抢夺这把锁,如果它能抢到,就会从 Blocked 状态回到 Runnable 状态。如下图所示:

1.3.3:Timed Waiting 计时等待

在 Waiting 上面是 Timed Waiting 状态,这两个状态是非常相似的,区别仅在于有没有时间限制,Timed Waiting 会等待超时,由系统自动唤醒,或者在超时前被唤醒信号唤醒。

  1. 让线程进入 Timed Waiting 状态有下面几种情况:

  • 设置了时间参数的 Thread.sleep(long millis) 方法;

  • 设置了时间参数的 Thread.join(long millis) 方法;

  • 设置了时间参数的 Object.wait(long timeout) 方法

  • 设置了时间参数的 LockSupport.parkNanos(long nanos) 方法和 LockSupport.parkUntil(long deadline) 方法。

  1. 让线程从 Timed Waiting 状态进入 Runable状态的情况:

如果它的超时时间到了且(能直接获取到锁或join的线程运行结束、被中断或调用了LockSupport.unpark() ),会直接恢复到 Runnable 状态,而无需经历 Blocked 状态。

  1. 让线程从 Timed Waiting 状态进入 Blocked状态的情况:

同waiting状态一样,Timed Waiting 中执行 notify() 和 notifyAll() 也是一样的道理,它们会先进入 Blocked 状态,然后抢夺锁成功后,再回到 Runnable 状态。

1.4:Terminated 终止

Terminated 终止状态,要想进入这个状态有两种可能。

  • run() 方法执行完毕,线程正常退出。

  • 出现一个没有捕获的异常,终止了 run() 方法,最终导致意外终止

1.5 小节

  1. 线程的状态是需要按照箭头方向来走的,比如线程从 New 状态是不可以直接进入 Blocked 状态的,它需要先经历 Runnable 状态。

  2. 线程生命周期不可逆:一旦进入 Runnable 状态就不能回到 New 状态;一旦被终止就不可能再有任何状态的变化。所以一个线程只能有一次 New 和 Terminated 状态,只有处于中间状态才可以相互转换。

二:java线程状态与操作系统线程状态的对应

2.1 操作系统中的线程状态

2.2 Java的Runable状态对应操作系统中的什么状态?

Java 中的 Runable 状态对应操作系统线程状态中的两种状态,分别是 Running 和 Ready,因为Java 中处于 Runnable 状态的线程有可能正在执行,也有可能没有正在执行,正在等待被分配 CPU 资源。

所以,如果一个正在运行的线程是 Runnable 状态,当它运行到任务的一半时,执行该线程的 CPU 被调度去做其他事情,导致该线程暂时不运行,它的状态依然不变,还是 Runnable,因为它有可能随时被调度回来继续执行任务。

2.2 Java的Waiting/Timed Waiting/Blocked状态对应操作系统中的什么状态?

无论是Timed Waiting ,Waiting还是Blocked,对应的都是操作系统线程的Waiting(等待)状态。

感谢各位的阅读,以上就是"Java线程的生命周期状态有哪些"的内容了,经过本文的学习后,相信大家对Java线程的生命周期状态有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

状态 线程 方法 运行 时间 系统 阻塞 周期 生命 操作系统 参数 情况 正在 只有 就是 学习 任务 内容 还是 调度 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技企业和互联网企业 互联网扶贫科技 有马互联网科技 互联网与未来科技 顺玮阁互联网科技 哈尔滨新华互联网科技学院 移动互联网科技股 现代互联网科技股 互联网经济与金融科技 哈尔滨屹滨互联网科技有限公司 国大互联网教育科技有限公司工作 浙南科技城互联网大厦建设工程 中国互联网公司排名锤子科技 阿里互联网科技企业 用友工业互联网科技发展 明优互联网科技有限公司 群盈汇互联网科技有限公司 互联网科技实习生岗位 陕西九四连强互联网科技有限公司 银川新华互联网科技学校招聘 河南云网互联网络科技有限公司 鸠鸠互联网科技 贷财互联网科技 北京互联网络科技有限公司 齐家互联网科技有限公司 湖南诚度互联网科技有限公司 福建科技产业互联网发展 燊美集互联网科技有限公司 领航科技大厦互联网公司 中国互联网公司的科技投入
0