线程状态

article/2025/9/19 3:26:19

原文:https://mp.weixin.qq.com/s/GsxeFM7QWuR--Kbpb7At2w

人类为了利用好自己的时间,经常会同时做多件事情,比如上厕所时刷手机,开车时听新闻... 对于自己尚且如此,对计算机也不能闲着。为了最大化的提升机器利用率,机器上同时会跑许多的服务,每个服务内,又跑着许多的「线程」。

 

这些线程奔忙在一线,努力的执行着「老大」交给自己的任务。偶有空闲时间,打个小盹。

 

经常会有人问类似这样的问题:

 

Q: 应用程序响应特别慢。不知道是什么原因。

A: 用 jstack 分析下应用的线程在干啥  (具体使用可以参考:Java 线程状态分析工具jstack)

Q: 打出来,这该怎么看呢?

A: 找应用具体执行业务逻辑的线程,看状态

Q: 有BLOCKED,有WAITING,不知道怎么看,看到有一段业务好像在取资源

A: ...资源阻塞了

 

这类问题,我们首先需要了解线程这些状态分别代表什么,这些状态之间,又是如何迁移变换的。

 

正好最近群里有人在问类似的问题,总结下方便有需要的朋友。

 

 线程的状态与转换

 

以 Java 语言为例,在语言初期就提供了创建多线程的能力。这些勤劳的线程,一生会经历多种状态

 

  • NEW

  • RUNABLE

  • TIMED_WAITING

  • WAITING

  • BLOCKED

  • TERMINATED

 

当前一个线程的的具体状态,通过Thread的 State 反映。通过这些状态,可以让「老大」了解到线程处于什么阶段。同时,对于我们开发者问题的诊断分析,也有很大的指导意义。

 

 

我们来看下面这张图,清晰的展示了线程状态的之间的变换过程。

 

 

比如我们较常见的 BLOCKED状态,一般都是在请求锁,在请求资源之类的。比如多线程操作数据库,一个耗时较多的操作,会导致其他对于库的写入也受影响。

 

再比如操作系统等限制了可以打开的文件句柄数,如果系统里已经打开达到了阈值,但未进行正确的关闭,此时就会产生问题。 这里需要注意的是,一些云服务器,云盘服务,对象存储等,也会对应的占用一个资源。我之前就在使用云服务的对象存储时,排查过类似的关闭问题。

 

TIME_WAITING 一般则是处于sleep方法,wait方法,join等操作,正在等待时间

 

RUNNABLE 一般都是你最喜欢看到的,在努力干着活的线程。

 

如何了解当前线程状态

 

我们前面提到,为了了解线程当前的执行状态,需要通过 jstack 工具来获取线程的 stack 信息,再从中找到我们关心的线程具体的执行情况。

 

这里首先需要关注的一点是,对于我们自己的线程,一定要「给他一个名字」。否则,在茫茫的线程海里,你只能欲哭无泪。

 

对于通过 Thread 创建线程时,可以直接通过构造方法指定名称。 通过「线程池」来获取线程,需要定义自己的ThreadFactory,在其中指定生成的线程名字。

 

你说我使用 ExecutorService,这个默认生成的线程池,使用的都是默认的 ThreadFactory,结果名字都是这个样子:

 

DefaultThreadFactory() {SecurityManager s = System.getSecurityManager();group = (s != null) ? s.getThreadGroup() :Thread.currentThread().getThreadGroup();namePrefix = "pool-" +poolNumber.getAndIncrement() +"-thread-";
}

 

如果线程多的话,全是 pool-x-thread-x 这个样子,你也需要具体定位。

 

有了具体名字之后,在jstack 生成的信息中,就可以直接定位我们关注的线程了。

 

比如通过jstack看到这样的信息:

 

 

此时,看到显眼的 BLOCKED 再分析是否是代码的问题

 

当然,在Linux环境中,也可以搭配置 「top」命令来分析。具体可以按这个步骤来操作:

 

  1. 先用top 命令在机器上分析出当前占用cpu的进程,

  2. 通过top -H -p <pid>  查看进程内各个线程的资源占用

  3. 第一列显示的是这些线程的pid,此时再搭配 jstack生成的线程 stack信息查找对应的内容。需要注意一点,这里得先把pid转换成十六进制,然后再搜索即可,对应我们上面内容中的nid

 

当然,除此之外,类似于 JConsole、JVisualVM 这些工具中都有关于线程的列表,本质上也和 jstack信息一致,不过是有显眼的颜色状态显示。

 

通过这些工具,来更详细的分析线程的工作情况,在问题产生的时候,可以做到有的放矢。

 

PS: 对于 jstack 工具的使用,可以间隔一小段时间多次打印,对比分析,发现问题。

 

图片来源(https://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.html)


http://chatgpt.dhexx.cn/article/El9A0GG8.shtml

相关文章

一条SQL语句的执行过程

摘要 本文站在后端开发的角度&#xff0c;讲述一条SQL从客户端发送到MySQL服务器进行处理&#xff0c;并将结果返回给客户端的过程。这个过程中涉及的操作会在后面的文章中做详细的分析。 连接建立 我们通常使用ORM框架来生成SQL语句&#xff0c;在发送SQL语句给MySQL服务器…

多线程执行sql报错处理

pymysql多线程访问数据库报错&#xff1a;Packet sequence number wrong - got 7 expected 2 原文&#xff1a;https://www.cnblogs.com/heiao10duan/p/9373237.html参考&#xff1a;https://www.jianshu.com/p/60c8e0e440ea原因&#xff1a; 使用了多线程&#xff0c;多线程共…

MySQL - 一条 SQL 语句是如何执行的(SQL执行详解)

前言 天天和数据库打交道&#xff0c;一天能写上几十条 SQL 语句&#xff0c;但你知道我们的系统是如何和数据库交互的吗&#xff1f;MySQL 如何帮我们存储数据、又是如何帮我们管理事务&#xff1f;....是不是感觉真的除了写几个 「select * from dual」外基本脑子一片空白&a…

一、SQL语句执行过程

一、MySQL架构图 MySQL逻辑架构图&#xff0c;可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&…

线程状态详解

线程的生命周期 new的时候即为创建状态。 调用start即为启动了&#xff0c;启动线程后就变为就绪状态&#xff0c; 就绪之后等待CPU的调度&#xff0c;CPU调度完之后&#xff0c;就进入了运行状态。 运行状态运行sleep方法时会进入阻塞状态&#xff0c;进入阻塞状态有非常多…

一条 SQL 语句是如何执行的

1. select 语句执行过程 一条 select 语句的执行过程如上图所示 1、建立连接 连接器会校验你输入的用户名和密码是否正确&#xff0c;如果错误会返回提示&#xff0c;如果正确&#xff0c;连接器会查询当前用户对于的权限。连接器的作用就是校验用户权限 2、查询缓存 MySQL…

SQL线程状态分析:processlist

老哥哔哔叨 我们已经写了很多 MySQL 的文章了&#xff0c;比如索引优化、数据库锁、主从复制等等。今天在来和大家学习一个优化方法&#xff1a;show processlist——查看当前所有数据库连接的 session 状态。帮助我们查看每个 SQL 线程的运行状态&#xff0c;是运行正常呀&…

线程的状态

1、线程有5种状态&#xff1a;新建&#xff08;new Thread&#xff09;、就绪&#xff08;runnable&#xff09;&#xff0c;运行&#xff08;running&#xff09;、阻塞&#xff08;blocked&#xff09;、结束&#xff08;dead&#xff09; 主要方法&#xff1a; setPriorit…

基于TCP和HTTP协议的RPC简单实现

一、RPC基本概念 1、基本概念 &#xff08;1&#xff09;RPC&#xff08;Remote Procedure Call Protocol&#xff09;——远程过程调用协议&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议&#xff1b; &#xff08;2&…

RPC协议及常用框架

https://www.jianshu.com/p/8ba4b7b834aa RPC协议 RPC:远程过程调用&#xff0c;原则上来说系统间跨进程的调用都属于RPC范畴 RMI/HTTP/dubbo/Spring Cloud/thrift RPC框架如何实现分布式环境下的远程调用 在一个典型的RPC的使用场景中&#xff0c;包含了服务发现&#xf…

【RPC】RPC基础(二)RPC协议

文章目录 RPC核心原理1. RPC基础1.2 RPC协议为什么设计RPC协议如何设计RPC协议可扩展协议的设计思考 RPC核心原理 1. RPC基础 1.2 RPC协议 RPC协议和HTTP协议一样都属于应用层协议 协议的作用&#xff1a; ​ 协议就像是文章中的标点符号、段落格式等规定&#xff0c;有了…

Nodejs 之 RPC 协议简介

背景 随着 Nodejs 的兴起&#xff0c;越来越多的 Web 服务中间层被搭建起来。如 Node 服务端渲染&#xff0c;BFF(Backend For Frontend))层&#xff0c;而 RPC 是远端过程调用&#xff0c;经常用于 BFF 层。最近&#xff0c;我打算写一个中间层&#xff0c;用 Nodejs 调用 Go…

RPC协议底层原理与实现

RPC协议基本组成 在一个典型RPC的使用场景中&#xff0c;包含了服务发现、负载、容错、 网络传输 、 序列化 等组件&#xff0c;其中RPC协议就指明了程序如何进行网络传输和序列化 。也就是说一个RPC协议的实现就等于一个非透明的RPC调用&#xff0c;如何做到的的呢&#xff1f…

RPC详解

RPC是什么 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用协议&#xff0c;一种通过网络从远程计算机上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC它假定某些协议的存在&#xff0c;例如TPC/UDP等&#xff0c;为通信程序之间携带信息数据。在O…

深入理解RPC—协议

协议 一提到协议&#xff0c;你最先想到的可能是 TCP 协议、UDP 协议等等&#xff0c;并且这些网络传输协议的实现有点晦涩难懂。虽然在 RPC 中我们也会用到这些协议&#xff0c;但这些协议更多的是对我们上层应用是透明的&#xff0c;我们 RPC 在使用过程中并不太需要关注他们…

浅谈RPC协议

RPC协议 RPC简介为啥需要RPCRPC的调用过程gRPCProtoBuffergRPC实战 RPC简介 RPC&#xff08;Remote Procedure Call Protocol&#xff09;远程过程调用协议&#xff0c;目标就是让远程服务调用更加简单、透明。RPC 框架负责屏蔽底层的传输方式&#xff08;TCP 或者 UDP&#x…

网络协议——RPC协议综述

拿最简单的场景&#xff0c;客户端调用一个加法函数&#xff0c;将两个整数加起来&#xff0c;返回它们的和。 如果放在本地调用&#xff0c;那是简单的不能再简单了&#xff0c;。但是一旦变成了远程调用&#xff0c;门槛一下子就上去了。 如何解决这五个问题&#xff1f; …

RPC(远程过程调用协议)简介

RPC框架解释 谁能用通俗的语言解释一下什么是 RPC 框架&#xff1f; - 远程过程调用协议RPC&#xff08;Remote Procedure Call Protocol) 首先了解什么叫RPC&#xff0c;为什么要RPC&#xff0c;RPC是指远程过程调用&#xff0c;也就是说两台服务器A&#xff0c;B&#xff0…

RPC和HTTP

一、为什么需要RPC&#xff0c;而不是简单的HTTP接口&#xff1f; RPC&#xff08;即Remote Procedure Call&#xff0c;远程过程调用&#xff09;&#xff0c;主要是基于TCP/IP协议&#xff1b;而HTTP服务主要是基于HTTP协议的。我们都知道HTTP协议是在传输层协议TCP之上的&a…

RPC入门总结(一)RPC定义和原理

转载&#xff1a;深入浅出 RPC - 浅出篇 转载&#xff1a;RPC框架与Dubbo完整使用 转载&#xff1a;深入浅出 RPC - 深入篇 转载&#xff1a;远程调用服务(RPC)和消息队列(Message Queue)对比及其适用/不适用场合分析 一、RPC 1. RPC是什么 RPC&#xff08;Remote Proced…