在JAVA程序中如何取得自身的进程号(PID)
============================
需求如题,不再赘述。
在JDK1.5以上版本,自带了一个工具jps.exe,可以帮助我们达成目标,简单测试代码如下:
import java.io.*;
public class JpsTest{
public static void test(){
String jps = "bin\\jps.exe";
try{
Process p = Runtime.getRuntime().exec(jps);
InputStream in = p.getInputStream();
InputStreamReader reader = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(reader);
String inStr = null;
StringBuffer sb = new StringBuffer("");
while( (inStr = br.readLine()) != null ){
sb.append(inStr + "\r\n");
}
System.out.println(sb.toString());
int count = 30;
while(count-->0){
try{
Thread.currentThread().sleep(1000);
}catch(Exception ex1){
ex1.printStackTrace();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
JpsTest.test();
}
}
在WinXP SP2上执行结果如下:
J:\>java JpsTest 740 JpsTest 3188 TCPMon 764 Jps
第一列是PID,第二列是程序名,根据程序名取出对应的PID即可。
JPS依赖 JDK_HOME\lib\tools.jar,如果是只在JRE环境下运行,需要把 JDK_HOME\bin\jps.exe 和 JDK_HOME\lib\tools.jar 分别复制到JRE_HOME\bin 和 JRE_HOME\lib下。对于有些对程序大小要求比较高的系统,可以给tools.jar瘦身,我不完全测试的结果如下:
tools.jar中只保留如下内容即可:
sun\jvmstat\ 下所有内容
sun\tools\jps 下所有内容
========================================
其实不用jps.exe也可以,只要执行:
J:\>java -cp lib\tools.jar sun.tools.jps.Jps
3188 TCPMon
3272 Jps