java中,线程的执行状态有哪些

在 Java 里,线程有 6 种执行状态,这些状态都在 java.lang.Thread.State 枚举类中被定义。下面为你详细介绍这些状态:

1. NEW(新建状态)

当你创建了一个 Thread 对象,却还未调用其 start() 方法时,线程就处于新建状态。此时,线程仅仅是一个对象实例,操作系统还未为其分配资源和执行环境。

示例代码:

java

Thread thread = new Thread(() -> {System.out.println("线程正在执行");
});
// 此时 thread 处于 NEW 状态

2. RUNNABLE(可运行状态)

调用 start() 方法之后,线程就进入了可运行状态。这一状态又包含两种情况:

  • 就绪状态:线程已经获取了除 CPU 之外的所有必要资源,正在等待操作系统的调度以获取 CPU 时间片。
  • 运行状态:线程已经获得 CPU 时间片,正在执行其 run() 方法中的代码。

示例代码:

java

Thread thread = new Thread(() -> {System.out.println("线程正在执行");
});
thread.start();
// 调用 start() 后,线程进入 RUNNABLE 状态

3. BLOCKED(阻塞状态)

当线程试图获取一个被其他线程占用的锁时,会进入阻塞状态。在获取到锁之前,线程会一直等待。

示例代码:

java

class LockExample {private static final Object lock = new Object();public static void main(String[] args) {Thread thread1 = new Thread(() -> {synchronized (lock) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 = new Thread(() -> {synchronized (lock) {System.out.println("线程 2 获得锁");}});thread1.start();thread2.start();// 线程 2 可能会进入 BLOCKED 状态,等待线程 1 释放锁}
}

4. WAITING(等待状态)

线程调用以下方法后会进入等待状态:

  • Object.wait()
  • Thread.join()
  • LockSupport.park()

处于等待状态的线程会一直等待,直到其他线程调用对应的唤醒方法,如 Object.notify() 或 Object.notifyAll()

示例代码:

java

class WaitingExample {private static final Object lock = new Object();public static void main(String[] args) {Thread thread1 = new Thread(() -> {synchronized (lock) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程 1 被唤醒");}});Thread thread2 = new Thread(() -> {synchronized (lock) {lock.notify();System.out.println("线程 2 唤醒线程 1");}});thread1.start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}thread2.start();}
}

5. TIMED_WAITING(定时等待状态)

线程调用以下带有超时参数的方法后会进入定时等待状态:

  • Thread.sleep(long millis)
  • Object.wait(long timeout)
  • Thread.join(long millis)
  • LockSupport.parkNanos(long nanos)
  • LockSupport.parkUntil(long deadline)

在指定的时间过去之后,线程会自动恢复到可运行状态。

示例代码:

java

Thread thread = new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程等待结束");
});
thread.start();
// 线程进入 TIMED_WAITING 状态,等待 1 秒

6. TERMINATED(终止状态)

线程的 run() 方法执行完毕,或者因异常而提前结束时,线程就进入终止状态。一旦线程进入终止状态,就无法再重新启动。

示例代码:

java

Thread thread = new Thread(() -> {System.out.println("线程正在执行");
});
thread.start();
// 线程执行完毕后进入 TERMINATED 状态

综上所述,Java 线程的 6 种执行状态反映了线程在其生命周期中的不同阶段,了解这些状态有助于你更好地控制和管理线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB 控制系统设计与仿真 - 41

鲁棒控制的其他函数 - 回路成型函数 loopsyn 灵敏度问题由鲁棒控制工具箱中的loopsyn就可以直接求解,该函数采用H无穷回路成型算法设计控制器,函数的调用格式为: [K,CL,gamma,info] = loopsyn(G,Gd) % G为受控对象模型% Gd为期望的回路传递函数% K为回路成型控制器模型% C…

查询Hologres或postgresql中的数据

因Hologres使用postgresql的语法.所以两者查询一样. 方案1: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;/*** 一个使用简单连接池管理PostgreSQL连接的工具类。*/ publi…

OpenBayes 一周速览|EasyControl 高效控制 DiT 架构,助力吉卜力风图像一键生成;TripoSG 单图秒变高保真 3D 模型

公共资源速递 10 个教程: * 一键部署 R1-OneVision * UNO:通用定制化图像生成 * TripoSG:单图秒变高保真 3D * 使用 VASP 进行机器学习力场训练 * InfiniteYou 高保真图像生成 Demo * VenusFactory 蛋白质工程设计平台 * Qwen2.5-0mni…

中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包

中兴云电脑W102D_晶晨S905X2_216G_mt7661无线_安卓9.0_线刷固件包 准备工作: 工具和设备在开始刷机之前,确保你已经准备好以下物品:双公头USB线:选择一根30-50厘米长的USB线,长度适中,方便操作,…

Rust 学习笔记:安装 Rust

Rust 学习笔记:安装 Rust Rust 学习笔记:安装 Rust在 Windows 上安装 Rust命令行创建 Rust 项目在 Mac/Linux 上安装 Rust一些命令升级卸载cargo -hrustc -h 安装 RustRoverrust-analyzer Rust 学习笔记:安装 Rust 在 Windows 上安装 Rust …

Opencv图像处理:轮廓检测、轮廓近似、绘制外接圆外接矩形

文章目录 一、图像轮廓检测1、比较2、常见的轮廓检测方法1)基于梯度的方法2)基于边缘检测器的方法3)基于阈值的方法 3、查找轮廓与绘制轮廓4、参数解释4、代码解释1)读取原图像灰度图并用二值化显示2)轮廓绘制3&#x…

精益数据分析(17/126):精益画布与创业方向抉择

精益数据分析(17/126):精益画布与创业方向抉择 大家好!一直以来,我都希望能和大家一起在创业和数据分析的领域中不断探索、共同进步。今天,我们接着深入学习《精益数据分析》,这次聚焦于精益画…

每天五分钟深度学习PyTorch:图像的处理的上采样和下采样

本文重点 在pytorch中封装了上采样和下采样的方法,我们可以使用封装好的方法可以很方便的完成采样任务,采样分为上采样和下采样。 上采样和下采样 下采样(缩小图像)的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。 下采样( 放大图像)的…

代码随想录训练营第39天 || 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III

198. 打家劫舍 思路: 动规五部曲: 1.dp数组及其下标的意义:dp数组表示当前房屋下偷与不偷的最大盗取金额 2.确定递推公式:因为盗取房屋只能间隔盗取,并且还要取最大值。所以每个房屋都有盗取和不盗取两个选择&…

【AI 加持下的 Python 编程实战 2_09】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(上)

DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(上) 1 起因 最近在看去年刚出了第 2 版《Learn AI-assisted Python Programming》,梳理完 第七章 的知识点后,总感觉这一章的话题很好——问题分解能力的培…

使用DeepSeek-Prover-V1.5解决数学问题

DeepSeek-Prover-V1.5-RLRMaxTS是一个结合强化学习和搜索策略的自动定理证明系统。 1. 初等代数:二次方程求解 问题:解方程 x - 5x 6 0 操作步骤: 将问题转换为Coq形式: Theorem quadratic : exists x : Z, x^2 - 5*x 6 0…

3.3 技术框架:LangChain、ReAct、Memory与Tool Integration

随着人工智能技术的飞速发展,智能代理(Agent)已成为企业实现自动化、智能化和个性化服务的核心工具。在2025年,技术框架如LangChain、ReAct、Memory和Tool Integration在构建高效、灵活的AI代理系统中占据了重要地位。这些框架通过…

STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。

1. 启动模式与地址映射 STM32F103 的启动模式由 BOOT0 和 BOOT1 引脚配置决定,不同的启动模式对应不同的存储器映射: 启动模式 映射地址范围 说明 主 Flash 0x08000000~0x0807FFFF 用户程序存储在 Flash 中,复位后从 Flash 启动&#xff08…

【C语言-选择排序算法】实现对十个数进行排序

目录 前言 一、选择排序算法原理 二、选择排序算法实现对十个数进行排序 三、代码运行示例 四、选择排序算法的时间复杂度和空间复杂度分析 五、选择排序算法的优缺点 六、总结 前言 在计算机科学领域,排序算法是基石般的存在,它们就像是整理杂乱…

配置Intel Realsense D405驱动与ROS包

配置sdk使用 Ubuntu20.04LTS下安装Intel Realsense D435i驱动与ROS包_realsense的驱动包-CSDN博客 中的方法一 之后不通过apt安装包,使用官方的安装步骤直接clone https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy 从这一步开始 执行完 这一步…

基于SpringBoot的中华诗词文化分享平台-项目分享

基于SpringBoot的中华诗词文化分享平台-项目分享 项目介绍项目摘要管理员功能图会员功能图系统功能图项目预览会员主页面诗词页面发布问题回复评论 最后 项目介绍 使用者:管理员、会员 开发技术:MySQLJavaSpringBootVue 项目摘要 本文旨在设计与实现一…

ProxySQL 性能调优工具推荐

ProxySQL 的性能优化需结合‌实时监控工具‌与‌自动化分析平台‌,以下为常用工具分类与推荐: 一、‌内置诊断工具‌ ProxySQL Admin 接口‌ 通过内置管理表直接分析性能数据: sql Copy Code SELECT * FROM stats_mysql_query_digest; – 高频查询分析(执行次数、平均耗…

unity TEngine学习记录3

上一篇讲了怎么使用te框架,本篇主要学习的是UI,一个游戏百分之70%都是UI的展示效果,现在让我们继续打开te官网找到UI部分继续学习。 ui创建以及加载 我们根据文档首先打开命名规则界面,大家第一次看就知道这个是干啥的,你想使用此…

23种设计模式-创建型模式之单例模式(Java版本)

Java 单例模式(Singleton Pattern)详解 🌟 什么是单例模式? 单例模式确保一个类只有一个实例,并提供一个全局访问点来访问它。 🧠 使用场景 配置管理类(如读取配置文件)日志工具类…

2025能源网络安全大赛CTF --- Crypto wp

文章目录 前言simpleSigninNumberTheory 前言 大半年以来写的第一篇文章!!! simpleSignin 题目: from Crypto.Util.number import * from gmpy2 import * import osflag bxxx p next_prime(bytes_to_long(os.urandom(128))…