Java如何获取当前进程ID以及所有Java进程的进程ID
程序员文章站
2024-02-13 13:00:52
首先是获取当前java运行的java进程id,这个是网上常见的,也就是java程序自身将进程id打印出来:
package com.test;
import...
首先是获取当前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项目的com.test包里
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: 浅谈Java多线程的优点及代码示例