当前位置: 首页 > article >正文

【JavaEE】多线程

8.线程状态

根据 Java 的Thread.state包,线程一共有六种状态:

  1. NEW
  2. RUNNABLE
  3. BLOCKED
  4. WAITING
  5. TIMED_WAITING
  6. TERMINATED

二、每种状态的含义

1. NEW(新建)

当使用new 关键字创建一个线程对象,但尚未调用其start() 方法时,线程处于新建状态。此时线程还没有开始执行,仅仅是一个对象实例,系统尚未为其分配执行资源。

2. RUNNABLE(就绪)

调用start() 方法后,线程进入就绪状态。处于这个状态的线程,要么正在被 CPU 执行,要么在等待 CPU 资源以便执行。Java 虚拟机的线程调度器会为处于该状态的线程分配执行时间片。

3. BLOCKED(阻塞)

线程在获取同步锁(例如synchronized)时,如果该锁已经被其他线程占用,那么当前线程就会进入阻塞状态。处于阻塞状态的线程会暂停执行,直到它成功获取到锁(由于锁竞争导致的阻塞)。

4. WAITING(等待)

当线程执行以下操作时会进入阻塞状态:

  • 调用没有超时参数的Object.wait() 方法。
  • 调用没有超时参数的Thread.join() 方法。
  • 调用LockSupport.park()方法。
    处于等待状态的线程会一直等待,直到其他线程执行特定操作(如调用Object.notify()或Object.notifyAll()唤醒等待的线程,或者join的目标线程执行完毕等)来将其唤醒。

5. TIMED_WAITING(限时等待)

线程进入限时等待状态的情况如下:

  • 调用带超时参数的Thread.sleep() 方法,使线程在指定时间内暂停执行。
  • 调用带超时参数的Object.wait() 方法,在等待指定时间后,如果没有被唤醒则自动恢复运行。
  • 调用带超时参数的Thread.join() 方法,等待指定时间后,不再等待目标线程执行完毕。
  • 调用LockSupport.parkNanos() 或 LockSupport.parkUntil() 等带时间限制的方法。

6. TERMINATED(终止)

线程执行完run() 方法中的所有代码,或者在run() 方法中抛出未捕获的异常导致线程提前结束,此时线程就进入终止状态。处于终止状态的线程不再执行任何代码,也不能再转换到其他状态。

三、状态之间的切换条件

1. NEW -> RUNNABLE

当在新建状态的线程对象上调用start() 方法时,线程从新建状态转换为可运行状态。

2. RUNNABLE -> BLOCKED

当处于可运行状态的线程尝试获取一个被其他线程占用的同步锁(进入synchronized)时,会从可运行状态转换为阻塞状态。

3. RUNNABLE -> WAITING

  • 线程调用没有超时参数的Object.wait() 方法时,会释放持有的锁(如果有)并进入等待状态。
  • 调用没有超时参数的Thread.join() 方法,等待另一个线程执行完毕,此时当前线程进入等待状态。
  • 调用LockSupport.park() 方法,线程进入等待状态。

4. RUNNABLE -> TIMED_WAITING

  • 调用Thread.sleep() 方法,线程在指定时间内进入限时等待状态。
  • 调用带超时参数的Object.wait() 方法,线程在等待指定时间内处于限时等待状态。
  • 调用带超时参数的Thread.join() 方法,在等待指定时间内线程处于限时等待状态。
  • 调用LockSupport.parkNanos() 或LockSupport.parkUntil() 方法,线程在指定时间内处于限时等待状态。

5. BLOCKED -> RUNNABLE

当处于阻塞状态的线程获取到它等待的同步锁时,会从阻塞状态转换为可运行状态,继续执行后续代码。

6. WAITING -> RUNNABLE

  • 当等待状态的线程被其他线程调用Object.notify() 或者 Object.notifyAll() 唤醒时(针对wait() 方法进入等待状态的情况)。
  • 当等待的join 目标线程执行完毕(针对join() 方法进入等待状态的情况)。
  • 当其他线程调用LockSupport.unpark() 方法来唤醒处于park() 等待状态的线程时,线程从等待状态转换为可运行状态。

7. TIMED_WAITING -> RUNNABLE

  • 当Thread.sleep() 的睡眠时间结束。
  • 当Object.wait() 的等待时间结束,且没有被提前唤醒。
  • 当Thread.join() 的等待时间结束,且目标线程还未执行完毕。
  • 当LockSupport.parkNanos() 或LockSupport.parkUntil() 的等待时间结束,线程从限时等待状态转换为可运行状态。

8. RUNNABLE -> TERMINATED

当线程的run() 方法执行完毕,或者run() 方法中抛出未捕获的异常时,线程从可运行状态转换为终止状态。

相关文章:

【JavaEE】多线程

8.线程状态 根据 Java 的Thread.state包,线程一共有六种状态: NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED 二、每种状态的含义 1. NEW(新建) 当使用new 关键字创建一个线程对象,但尚未调用其start() 方法时…...

【项目】在线OJ(负载均衡式)

目录 一、项目目标 二、开发环境 1.技术栈 2.开发环境 三、项目树 目录结构 功能逻辑 编写思路 四、编码 1.complie_server 服务功能 代码蓝图 开发编译功能 日志功能 ​编辑 测试编译模块 开发运行功能 设置运行限制 jsoncpp 编写CR 如何生成唯一文件名 …...

贪心算法应用:在线租赁问题详解

贪心算法应用:在线租赁问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。在线租赁问题(Greedy Algorithm for Online Rentals)是一个经典的贪心算法应用场景,下面我将从多个维度全面…...

torch.zeros()用法简介

torch.zeros()是PyTorch中用于创建全零张量的核心函数,其功能和使用方法如下: 1. ‌基本语法‌ torch.zeros(*size, outNone, dtypeNone, layouttorch.strided, deviceNone, requires_gradFalse)参数说明: *size:定义张量形状的…...

Prj10--8088单板机C语言8259测试(1)

1.原理图 2.Deepseek示例代码 #include <dos.h> #include <conio.h> #include <stdio.h>#define PIC1_CMD 0x400 // 命令端口 (A00) #define PIC1_DATA 0x401 // 数据端口 (A01)volatile int int_count 0; // 中断计数器 void interrupt (*old_isr)(…...

3步在小米13手机跑DeepSeek R1

大家好&#xff01;我是羊仔&#xff0c;专注AI工具、智能体、编程。 一、从性能旗舰到AI主机 春节大扫除时&#xff0c;翻出尘封的小米13&#xff0c;这台曾以骁龙8 Gen2著称的性能小钢炮&#xff0c;如今正在执行更科幻的使命——本地运行DeepSeek R1。 想起两年前用它连续肝…...

数智管理学(十六)

二、分布式网络型结构的特点 分布式网络型结构是一种去中心化、扁平化和协作性的组织模式&#xff0c;与传统金字塔型结构形成鲜明对比。它通过赋予团队和个体更大的自主权&#xff0c;提升组织的灵活性和响应能力。 &#xff08;一&#xff09;节点化组织 1.模块化团队构成…...

注销微软账户

因为我的微软开发者账户丢失 Office E5 权限&#xff0c;因此需要注销。 若你需要注销微软账号&#xff0c;请点击下方超链接。 点击此处 注销之后仅剩一个正常的账户使用咯&#xff01;&#xff01;...

Ubuntu 服务器软件更新,以及常用软件安装 —— 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录 3

前言 前面&#xff0c;我们已经 安装好了 Ubuntu 服务器系统&#xff0c;并且 配置好了 ssh 免密登录服务器 &#xff0c;现在&#xff0c;我们要来进一步的设置服务器。 那么&#xff0c;本文&#xff0c;就是进行服务器的系统更新&#xff0c;以及常用软件的安装 调整 Ubu…...

Mysql常用知识3:Kafka和数据库优化

文章目录 一、分布式消息系统&#xff08;Kafka相关问题5-10&#xff09;5. Kafka如何保证消息不丢失&#xff1f;6. 项目中Kafka具体怎么使用的&#xff1f;7. 消息异常未发送成功怎么解决&#xff1f;8. 重试具体怎么做的&#xff0c;循环吗&#xff1f;9. 重试多次失败怎么办…...

Milvus单机模式安装和试用

1.安装ollama的package包&#xff1b; # install package pip install -U langchain-ollama2.我们直接使用ChatOllama实例化模型&#xff0c;并通过invoke进行调用&#xff1b; from langchain_ollama import ChatOllamallm ChatOllama(model"deepseek-r1") messa…...

飞牛NAS+Docker技术搭建个人博客站:公网远程部署实战指南

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress总结 前言 在数字化浪潮中&#xff0c;传统网站搭建方式正面临前所未…...

刷leetcode hot100返航必胜版--链表6/3

链表初始知识 链表种类&#xff1a;单链表&#xff0c;双链表&#xff0c;循环链表 链表初始化 struct ListNode{ int val; ListNode* next; ListNode(int x): val&#xff08;x&#xff09;,next(nullptr) {} }; //初始化 ListNode* head new ListNode(5); 删除节点、添加…...

C# 序列化技术全面解析:原理、实现与应用场景

在软件开发中&#xff0c;数据持久化和网络通信是两个至关重要的环节。想象一下&#xff0c;当我们需要将一个复杂的对象保存到文件中&#xff0c;或者通过网络发送到另一台计算机时&#xff0c;如何有效地表示这个对象&#xff1f;这就是序列化技术要解决的问题。序列化&#…...

isp调试 blend模式指什么

isp调试 blend模式指什么 答案摘自豆包&#xff1a; 在图像信号处理&#xff08;ISP&#xff0c;Image Signal Processor&#xff09;调试中&#xff0c;Blend 模式&#xff08;混合模式&#xff09; 是指将不同处理阶段的图像数据或不同来源的图像信息按照特定规则进行叠加或…...

electron定时任务,打印内存占用情况

// 监听更新 function winUpdate(){// 每次执行完后重新设置定时器try {// 获取当前时间并格式化为易读的字符串const now new Date();const timeString now.toLocaleString();console.log(当前时间: ${timeString});// 记录内存使用情况&#xff08;可选&#xff09;const m…...

Gitee Wiki:以知识管理赋能 DevSecOps,推动关键领域软件自主演进

关键领域软件研发中的知识管理困境 传统文档管理模式问题显著 关键领域软件研发领域&#xff0c;传统文档管理模式问题显著&#xff1a;文档存储无系统&#xff0c;查找困难&#xff0c;降低效率&#xff1b;更新不及时&#xff0c;与实际脱节&#xff0c;误导开发&#xff1…...

学习STC51单片机24(芯片为STC89C52RCRC)

每日一言 把 “我不行” 换成 “我试试”&#xff0c;你会发现一片新的天地。 那关于优化 白盒测试 我们之前不是通过这个接线方式可以看到返回到信息嘛因为安信可的特性就是返回Esp8266的反馈&#xff0c;可以看到代码死在哪里了&#xff0c;导致连接不上&#xff0c;因为我们…...

LabVIEW基于 DataSocket从 OPC 服务器读取数据

LabVIEW 中基于 DataSocket 函数从 OPC 服务器读取数据的功能&#xff0c;为工业自动化等场景下的数据交互提供了解决方案。通过特定函数实现 URL 指定、连接建立与管理、数据读取&#xff0c;相比传统 Socket 通信和 RESTful API &#xff0c;在 OPC 服务器数据交互场景有适配…...

阿里云无影云桌面深度测评

阿里云无影桌面深度测评&#xff1a;解锁云端工作“新范式”的“未来之钥”&#xff01; 在数字化浪潮席卷全球的2025年&#xff0c;远程办公与混合办公已不再是权宜之计&#xff0c;而是职场不可逆转的新常态。然而&#xff0c;如何确保员工无论身在何处&#xff0c;都能拥有…...

【208】VS2022 C++ 32位整数和unsigned char数组之间互相转换

一、场景 在实际应用中&#xff0c;特别是在数据传输的时候&#xff0c;需要读取unsigned char数组&#xff0c;再转换成 32 位整数&#xff1b;或者把 32 位整数转换成 unsigned char数组进行写入。比如对接西门子PLC的 snap7 就是这样。32 位整数分成有符号的无符号的&#…...

数据库技术

InnoDB是什么&#xff1f;MySQL 和 InnoDB的关系是什么&#xff1f; InnoDB是MySQL数据库系统中最重要且默认的存储引擎。MySQL采用插件式存储引擎架构&#xff0c;作为数据库管理系统本身不直接处理数据存储&#xff0c;而是通过存储引擎接口与InnoDB等引擎交互。InnoDB作为M…...

深入浅出:Oracle 数据库 SQL 执行计划查看详解(1)——基础概念与查看方式

背景 在当今的软件开发领域&#xff0c;尽管主流开发模式往往倾向于采用单表模式&#xff0c;力图尽可能地减少表之间的连接操作&#xff0c;以期达到提高数据处理效率、简化应用逻辑等目的。然而&#xff0c;对于那些已经上线运行多年的运维老系统而言&#xff0c;它们内部往…...

前端​​HTML contenteditable 属性使用指南

​​什么是 contenteditable&#xff1f; HTML5 提供的全局属性&#xff0c;使元素内容可编辑类似于简易富文本编辑器兼容性​​ 支持所有现代浏览器&#xff08;Chrome、Firefox、Safari、Edge&#xff09; 移动端&#xff08;iOS/Android&#xff09;部分键盘行为需测试 &l…...

自动化采集脚本与隧道IP防封设计

最近群里讨论问如何编写一个自动化采集脚本&#xff0c;要求使用隧道IP&#xff08;代理IP池&#xff09;来防止IP被封。这样的脚本通常用于爬虫或数据采集任务&#xff0c;其中目标网站可能会因为频繁的请求而封禁IP。对于这些我还是有些经验的。 核心思路&#xff1a; 1、使…...

【设计模式-4.7】行为型——备忘录模式

说明&#xff1a;本文介绍行为型设计模式之一的备忘录模式 定义 备忘录模式&#xff08;Memento Pattern&#xff09;又叫作快照模式&#xff08;Snapshot Pattern&#xff09;或令牌模式&#xff08;Token Pattern&#xff09;指在不破坏封装的前提下&#xff0c;捕获一个对…...

docker离线镜像下载

背景介绍 在某些网络受限的环境中&#xff0c;直接从Docker Hub或其他在线仓库拉取镜像可能会遇到困难。为了在这种情况下也能顺利使用Docker镜像&#xff0c;我们可以提前下载好所需的镜像&#xff0c;并通过离线方式分发和使用。 当前镜像有&#xff1a;python-3.8-slim.ta…...

Vert.x学习笔记-Verticle原理解析

Vert.x学习笔记 一、设计理念&#xff1a;事件驱动的组件化模型二、生命周期管理三、部署方式与策略四、通信机制&#xff1a;事件总线&#xff08;Event Bus&#xff09;五、底层实现原理六、典型应用场景七、Verticle与EventLoop的关系1、核心关系&#xff1a;一对一绑定与线…...

Cobra CLI 工具使用指南:构建 Go 语言命令行应用的完整教程

Cobra CLI 工具使用指南&#xff1a;构建 Go 语言命令行应用的完整教程 在 Go 语言开发中&#xff0c;构建功能强大的命令行界面&#xff08;CLI&#xff09;应用是常见需求。Cobra 作为 Go 生态中最受欢迎的 CLI 库&#xff0c;凭借其灵活的设计和丰富的功能&#xff0c;成为…...

jQuery和CSS3卡片列表布局特效

这是一款jQuery和CSS3卡片列表布局特效。该卡片布局使用owl.carousel.js来制作轮播效果&#xff0c;使用简单的css代码来制作卡片布局&#xff0c;整体效果时尚大方。 预览 下载 使用方法 在页面最后引入jquery和owl.carousel.js相关文件。 <link rel"stylesheet&qu…...