一、前言

为了在本地查看java程序运行后的线程,除了使用cmd命令、还可用到wmic、PowerShell,同时也为了怕被忘记,我就记录一下了。

二、命令介绍

1.cmd

命令提示符是Windows早期版本中的命令行界面,用于执行基本的系统管理任务和文件操作,对于老旧版本的Windows系统,cmd仍然是主要的命令行工具。

2.wmic

wmic 是一个用于管理和查询系统资源的命令行工具,基于WMI(Windows Management Instrumentation),可以获取和设置系统硬件、软件、操作系统等的详细信息。

常用命令包括 wmic process list brief(列出进程)、wmic cpu get loadpercentage(获取CPU负载)、wmic logicaldisk get size,freespace(获取磁盘空间信息)等。

使用方法是直接在cmd框中输入wmic指令即可。

3.PowerShell

PowerShell 是一个功能强大的脚本语言环境,用于管理和自动化系统任务;支持脚本编写、对象操作和高级的系统管理功能;内置了丰富的命令和模块,可以执行几乎所有的系统管理任务。

功能非常强大,支持复杂的脚本编写和高级的对象操作,提供了大量的内置命令和模块,可以执行几乎所有的系统管理任务。内置在所有较新的Windows版本中(Windows 7 及更高版本),并且在Windows 10和Windows 11中得到了进一步的增强。

通过win+X,或者右击win图标,选择Windows PowerShell,弹出一个蓝色的框。

三、命令使用

下面以程序名开头,获取进程ID,再根据进程ID查询详情(包括状态、线程数等),最后再根据进程ID,查询下面的所有线程并列出线程信息。

1.根据程序名获取进程

1
tasklist | findstr "java"

2.根据进程ID查看进程信息

1
tasklist /FI "PID eq 1234" /V

3.根据进程ID获取详细信息,线程总数

这里有有一个需要注意的点是,像Java程序运行后,JVM除了主线程外,还会开启多个子线程用于垃圾回收等操作。所以就算在程序中只开启了一个线程,加上自带的都会有十几个子线程。

而通过任务管理器,在详细信息中找到的进程,然后右键 “分析等待链”,列出的线程也就展示前两个的线程ID,而通过PowerShell可列出所有线程。

1
wmic process where processid=1234 get processid,threadcount

4.根据进程ID列出所有线程

1
Get-Process -Id 1234 | Select-Object -ExpandProperty Threads

5.直接根据程序名列出所有线程

1
Get-Process -Name notepad | Select-Object -ExpandProperty Threads

四、写在后面

在计算机科学中,进程、线程和协程是用于管理和调度任务的基本概念。而进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己的独立地址空间,包括代码、数据和堆栈;进程可以包含一个或多个线程,并且每个进程由操作系统独立管理。

线程是进程中的执行单元,是操作系统进行调度的基本单位,线程共享进程的资源,如内存空间、文件句柄等,但每个线程有自己的堆栈、程序计数器和局部变量。

协程是一种用户态轻量级线程,可以暂停和恢复执行,而不像线程那样需要操作系统支持。协程可以理解为在单个线程中交叉执行的函数,作用还是提升单线程的利用率,减少资源占用。

而且他虽然不是由操作系统调度,但是也不是自己的业务程序分配哪个先哪个后,而是由支持协程的扩展或编程语言的运行时,里面封装调度器进行管理,比如执行到业务中定义的一个有IO操作的协程就会马上切到下一个协程,等上一个IO接触就返回给回调函数。

image-20250408192801332