这里有新鲜出炉的 Java 函数式编程,程序狗速度看过来!
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
本篇文章主要介绍了 Java 如何获取当前进程 ID 以及所有 Java 进程的进程 ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
首先是获取当前 Java 运行的 Java 进程 ID,这个是网上常见的,也就是 Java 程序自身将进程 ID 打印出来:
- package com.test;
- import java.lang.management.ManagementFactory;
- import java.lang.management.RuntimeMXBean;
- public class Target {
- public static void main(String[] args) throws InterruptedException {
- System.out.println(getProcessID());
- while (true) {
- Thread.sleep(10000);
- }
- }
- public static final int getProcessID() {
- RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
- System.out.println(runtimeMXBean.getName());
- return Integer.valueOf(runtimeMXBean.getName().split("@")[0]).intValue();
- }
- }
运行结果:
- 2896@PC-20150603VRPL
- 2896
ManagementFactory 是一个在运行时管理和监控 Java VM 的工厂类,它能提供很多管理 VM 的静态接口,比 RuntimeMXBean;
RuntimeMXBean 是 Java 虚拟机的运行时管理接口.
当前进程 ID 为 2896。
但这种让 Java 进程自行打印 ID 的方式并不太好用,因为很多时候我们是需要在不修改代码另一个 Java 程序代码的情况下知道这个正在运行着的 Java 进程的 ID,如果你也有这个需求,可以看一下下面的解决方法:
获取所有正在运行着的 Java 进程
- package com.test;
- import java.util.HashSet;
- import java.util.Set;
- import sun.jvmstat.monitor.MonitoredHost;
- import sun.jvmstat.monitor.MonitoredVm;
- import sun.jvmstat.monitor.MonitoredVmUtil;
- import sun.jvmstat.monitor.VmIdentifier;
- public class ProcessID {
- public static void main(String[] args) throws Exception {
- // 获取监控主机
- MonitoredHost local = MonitoredHost.getMonitoredHost("localhost");
- // 取得所有在活动的虚拟机集合
- Set < ?>vmlist = new HashSet < Object > (local.activeVms());
- // 遍历集合,输出PID和进程名
- for (Object process: vmlist) {
- MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + process));
- // 获取类名
- String processname = MonitoredVmUtil.mainClass(vm, true);
- System.out.println(process + " ------> " + processname);
- }
- }
- }
运行结果:
- 2752 ------>
- 5172 ------> com.test.Target
- 5308 ------> com.test.ProcessID
这样,就可以根据类名找到进程号了。
MonitoredHost 等类位于 ${JAVA_HOME}/lib/tools.jar
下面是一个可以直接根据类找到对应 Java 进程 ID 的方法:
- package com.test;
- import java.net.URISyntaxException;
- import java.util.HashSet;
- import java.util.Set;
- import sun.jvmstat.monitor.MonitorException;
- import sun.jvmstat.monitor.MonitoredHost;
- import sun.jvmstat.monitor.MonitoredVm;
- import sun.jvmstat.monitor.MonitoredVmUtil;
- import sun.jvmstat.monitor.VmIdentifier;
- public class ProcessID {
- public static void main(String[] args) throws Exception {
- int pid = getProcess(Target.class);
- System.out.println("PID: " + pid);
- }
- public static int getProcess(Class < ?>cls) throws MonitorException,
- URISyntaxException {
- if (cls == null) {
- return - 1;
- }
- // 获取监控主机
- MonitoredHost local = MonitoredHost.getMonitoredHost("localhost");
- // 取得所有在活动的虚拟机集合
- Set < ?>vmlist = new HashSet < Object > (local.activeVms());
- // 遍历集合,输出PID和进程名
- for (Object process: vmlist) {
- MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + process));
- // 获取类名
- String processname = MonitoredVmUtil.mainClass(vm, true);
- if (cls.getName().equals(processname)) {
- return ((Integer) process).intValue();
- }
- }
- return - 1;
- }
- }
运行结果:
PID: 5172
源码位于我的 Github 项目 aoptracer 的 com.test 包里
来源: http://www.phperz.com/article/17/0828/338466.html