news 2026/2/2 10:32:54

说说线程的生命周期和状态

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
说说线程的生命周期和状态

在Java中,线程的生命周期和状态是由java.lang.Thread.State枚举定义的。

目录

  • NEW(新建)
  • RUNNABLE(可运行)
  • BLOCKED(阻塞)
  • WAITING(等待)
  • TIMED_WAITING(超时等待)
  • TERMINATED(终止)

NEW(新建)

当线程对象被创建但尚未启动时,线程处于NEW状态。

例如:Thread t = new Thread(); 此时t的状态就是NEW。

RUNNABLE(可运行)

当线程对象调用start()方法后,线程进入RUNNABLE状态。注意,RUNNABLE状态对应操作系统线程状态中的就绪(ready)和运行(running)两种状态。也就是说,处于RUNNABLE状态的线程可能在等待CPU时间片,也可能正在执行。

在Java中,将就绪和运行两种状态合并为RUNNABLE状态。

BLOCKED(阻塞)

线程试图获取一个内部的对象锁(不是java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入BLOCKED状态。当其他线程释放该锁,并且线程调度器允许该线程持有该锁时,该线程将变成RUNNABLE状态。

例如,线程在等待进入synchronized方法或代码块时,可能会进入BLOCKED状态。

WAITING(等待)

线程进入等待状态,等待另一个线程执行一个特定动作。以下方法可以使线程进入WAITING状态:

Object.wait():调用此方法前,线程必须持有对象锁。调用后,线程释放锁并进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法,或者被中断。

Thread.join():等待另一个线程终止。例如,线程A调用线程B的join()方法,那么线程A将等待线程B执行完毕,此时线程A进入WAITING状态。

LockSupport.park():当前线程调用此方法也会进入等待状态。

处于WAITING状态的线程正在等待另一个线程的某个操作,例如通知或中断。

TIMED_WAITING(超时等待)

与WAITING状态类似,但线程只等待指定的时间。以下方法可以使线程进入TIMED_WAITING状态:

Thread.sleep(long millis)

Object.wait(long timeout)

Thread.join(long millis)

LockSupport.parkNanos(long nanos)

LockSupport.parkUntil(long deadline)

当等待时间超过指定时间后,线程会自动返回RUNNABLE状态,或者在被中断时返回。

TERMINATED(终止)

线程执行完毕(即run()方法执行完成)或者因为异常而退出,线程进入TERMINATED状态。termindated

注意:线程的状态转换是受JVM和操作系统线程调度器控制的。理解这些状态对于多线程编程和调试非常重要。

Java的线程状态是对操作系统底层状态的一个抽象和封装。**RUNNABLE状态对应了操作系统的就绪态和运行态,表示线程已准备好被CPU调度。**而WAITING和TIMED_WAITING状态,是Java在语言层面定义的、用于线程间协作的等待状态。处于这些状态的线程,其对应的操作系统线程已经被挂起,不在操作系统的就绪队列中,因此完全没有被CPU调度的资格。它们等待的是来自其他线程的特定信号(如notify)或超时,而不是CPU资源。

从操作系统的视角看,该线程的执行上下文已被内核保存,并且被从 CPU 调度器的就绪队列中移除,进入一个休眠状态,不再参与 CPU 时间片的竞争。只有等待的特定条件满足后,内核才会将其重新激活并放回就绪队列。Java 中的 WAITING、TIMED_WAITING 和因未抢到 synchronized 锁而产生的 BLOCKED 状态,其底层的操作系统线程通常都处于这种被挂起的状态

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/29 12:58:53

流量控制和拥塞控制的步骤?流量控制和拥塞控制的步骤?

流量控制保护接收方,拥塞控制保护网络; 流量控制靠 接收窗口(rwnd),拥塞控制靠 (cwnd)拥塞窗口 及其四阶段算法 最终的发送窗口 min(rwnd, cwnd) 接收端在三次握手或每次 ACK 中,将当前可用缓冲大小 (rwnd) 通知发送端。发送端计…

作者头像 李华
网站建设 2026/1/29 14:34:34

【Dify 1.7.0音频质量突破】:如何用内置检测模块实现零误差语音识别

第一章:Dify 1.7.0音频质量检测的核心突破Dify 1.7.0版本在音频质量检测领域实现了关键性技术跃迁,显著提升了实时音频分析的精度与响应效率。该版本引入了基于深度学习的噪声识别模型,并优化了端到端的音频处理流水线,使得系统能…

作者头像 李华
网站建设 2026/1/29 14:52:36

C++20 std::atomic_ref 的核心实现细节解析

C20 std::atomic_ref 的核心实现细节解析核心结论std::atomic_ref 是 C20 引入的原子操作工具,通过引用现有变量实现线程安全操作。其关键实现细节包括:‌原子操作机制‌‌硬件支持‌:利用 CPU 的原子指令(如 CAS)实现…

作者头像 李华
网站建设 2026/1/29 13:57:00

Python积分与求导完全指南

📊 Python积分与求导完全指南 📑 目录 求导基础Python求导实战积分基础Python积分实战概率分布函数详解知识点 1. 求导基础 📐 1.1 知识点引入 想象你正在开车,速度表显示的数字就是你的瞬时速度,这个速度其实就是位…

作者头像 李华
网站建设 2026/1/30 17:21:55

SDUT Java 类和对象

6-7 sdut-oop-6-方形矩阵的运算&#xff08;类和对象&#xff09;class Matrix{int n;int[][] matrix;//带参构造方法public Matrix(int n, int[][] matrix) {this.n n;this.matrix matrix;}public Matrix add(Matrix other){int [][ ]resultnew int [n][n];for(int i0;i<…

作者头像 李华
网站建设 2026/1/29 13:19:59

LobeChatUGC内容激励方案

LobeChat UGC内容激励方案 在AI助手从实验室走向千家万户的今天&#xff0c;一个关键问题摆在开发者面前&#xff1a;如何让开源项目不只是“能用”&#xff0c;而是真正“被广泛使用”&#xff1f;答案或许不在于功能堆砌&#xff0c;而在于构建一种用户愿意参与、乐于贡献的内…

作者头像 李华