> 文章列表 > 如何在Java程序中获取自己的进程号

如何在Java程序中获取自己的进程号

如何在Java程序中获取自己的进程号

在分布式系统中,对于一个需要全局唯一ID的需求,我们可能会按照如下的格式来定一个ID的组成:
机器编号 + 进程号 + 时间戳 + 流水号
按照上面这个逻辑,我们可能会得到一个类似 08C5 00375 20210320232030 0001 这样的ID。

当然根据您的业务实际情况,这个ID的规则可能会有很多变种。比如去掉空格、加上业务标志符、时间戳到毫秒、时间戳到日期、每个部分用不同的符号分隔等等,这些当然都是可以的。但是仔细一想好像哪里不对劲,我怎么获取自己正在运行的进程号呢?

不过,如果您不存在一个机器或容器里面运行多个相同业务实例的话,那肯定可以不用进程号来区分了。这个就属于本篇文章之外的情况,咱们暂不考虑。下面就来说明如何在运行的过程中获取自己的进程号。

获取Java进程自己的进程号
从JDK 1.5开始,软件包 java.lang.management 提供了管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。它同时允许从本地和远程对正在运行的 Java 虚拟机进行监视和管理。

其中java.lang.management.RuntimeMXBean 为Java 虚拟机的运行时系统的管理接口。
Java 虚拟机具有此接口的实现类的单一实例。实现此接口的实例是一个 MXBean,它可以通过调用 ManagementFactory.getRuntimeMXBean() 方法或从平台 MBeanServer 方法获得。

为我们可以通过 RuntimeMXbean 对象来获取当前运行时的信息,自然也就可以获取到自己的进程号了。请看如下代码:

import java.lang.management.ManagementFactory;public class PIDSelector {public static void main(String[] args) {String name = ManagementFactory.getRuntimeMXBean().getName();System.out.println(name);String pid = name.split("@")[0];System.out.println("Pid is:" + pid);}
}

运行上面的代码,输出结果为:

13904@msi
Pid is:13904

这样我们就得到了当前运行中进程自己的进程号。

PS:顺便提一句,一般ID都需要有固定的位数,所以涉及到序列号格式化的问题。因为在Windows(x86/64)、Linux/Unix(x86/x64)等其他不同平台上进程号的最大值是不一样的。您如果需要格式化进程号,最好是调研一下您的运行平台的最大进程号是多少,以免出现溢出或反转的问题。

附Java方法:

  /* 获取当前程序的进程ID* 25107@abc.mmm.xxx.yyy.com* Pid is: 25107* @return*/public static int getPid() {RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();String name = runtime.getName(); // format: "pid@hostname"try {return Integer.parseInt(name.substring(0, name.indexOf('@')));} catch (Exception e) {return -1;}}