ps -t -p pid 是查看指定进程线程数最轻量常用方法,输出中tid≠pid(主线程除外),线程数=行数−1;top -h -p pid 实时监控线程cpu占用;/proc/pid/status 的threads字段最权威,适合脚本调用。

ps 和 top 是 Linux 下查看进程线程数最直接、无需额外安装的工具,但参数组合容易出错——比如用 ps -ef 看不到线程,而 ps -T 不加 -p 会列出所有线程,信息爆炸。
ps -T 查看指定进程的所有线程
这是最轻量、最常用的方法,适用于快速确认某进程是否多线程及线程总数。
-
ps -T -p <code>PID:必须带-p指定进程 ID,否则-T会作用于全部进程,输出极长 - 输出列中
TID(Thread ID)和PID多数情况下不同;主线程的TID == PID,其余为子线程 - 线程数 = 输出行数(含表头)− 1;也可用
ps -T -p <code>PID| wc -l 快速计数 - 注意:
ps -T在较老内核(如 RHEL6/CentOS6)上可能不支持,会报unknown option -- T,此时改用ps -L -p <code>PID
top -H 实时监控线程级 CPU 占用
当你要观察线程级资源波动(比如某个 Java 应用里某条线程突然吃满一个 CPU 核),top -H 比 ps 更有效。
-
top -H -p <code>PID:只显示该进程下的所有线程,-H开启线程模式,-p限定范围,避免被其他线程干扰 - 默认按 CPU% 排序,可按
P(CPU)、M(内存)、T(运行时间)重新排序 - 注意:进入
top -H后再按H切换线程/进程视图,效果不稳定;应始终用命令行参数启动,而非运行中切换 - 线程名在
COMMAND列显示,但常被截断;可按c键展开完整命令行(含 JVM 线程名或 pthread 名)
从 /proc/PID/status 提取线程数(脚本友好)
需要写监控脚本或做自动化判断时,解析 /proc/<code>PID/status 比调用 ps 更可靠——它不依赖外部命令,且字段稳定。
-
grep Threads /proc/<code>PID/status 输出形如Threads: 24,直接提取数值即可 - 该值是内核维护的实时线程数,比
ps -T快照更权威;但注意它不含已退出但未被wait()的僵尸线程 - 若
PID不存在或权限不足,grep会静默失败;建议先用kill -0 <code>PID做存在性校验 - 不要用
ls /proc/<code>PID/task | wc -l 计数:目录项包含已退出线程的残留子目录,结果偏高
htop 和 pstree 辅助理解线程关系
这两个工具不替代 ps/top,但在排查线程归属、父子关系或调试线程泄漏时很有用。
-
htop启动后按H切换线程视图,支持鼠标滚动、颜色高亮,但需提前安装(yum install htop或apt install htop) -
pstree -p <code>PID显示该进程及其所有线程的树状结构,线程以花括号标注,例如java(1234)─┬─{java}(1235),直观体现主线程与子线程层级 -
pstree -p -T可强制显示线程(某些旧版本默认隐藏),但部分发行版的pstree不支持-T,需查手册确认 - 注意:
pstree中的线程名来自内核comm字段,可能和ps -T的COMMAND不一致(后者可能含参数)
真正容易被忽略的是线程状态一致性:/proc/<code>PID/status 的 Threads: 行反映内核当前统计,而 ps -T 和 top -H 都是用户态快照,三者在高并发创建/销毁线程时可能差 1–2 个。生产环境做告警阈值判断,优先以 /proc/<code>PID/status 为准。











