资讯专栏INFORMATION COLUMN

Java获取当前进程ID以及所有Java进程的进程ID

roland_reed / 515人阅读

摘要:获取当前进程以及所有进程的进程首先是获取当前运行的进程,这个是网上常见的,也就是程序自身将进程打印出来是一个在运行时管理和监控的工厂类,它能提供很多管理的静态接口,比如是虚拟机的运行时管理接口获取所有正在运行着的进程获取监控主机取得所有在活

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();  
    } 

}
ManagementFactory是一个在运行时管理和监控Java VM的工厂类,它能提供很多管理VM的静态接口,比如RuntimeMXBean;
RuntimeMXBean是Java虚拟机的运行时管理接口.

获取所有正在运行着的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(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);
         }
     }
}
MonitoredHost等类位于${JAVA_HOME}/lib/tools.jar

_
运行结果:

2752 ------> 
5172 ------> com.test.Target
5308 ------> com.test.ProcessID

直接根据类找到对应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(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;
    }
}

根据类名称找到对应Java进程ID的方法


package com.example.demo;

import sun.jvmstat.monitor.*;

import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Set;

public class ProcessID2 {
    public static void main(String[] args) throws Exception {
        int pid = getProcess("cn.usr.demo.DemoApplication");
        System.out.println("PID: " + pid);
    }

    public static int getProcess(String cls) throws MonitorException, URISyntaxException {
        if (cls == null) {
            return -1;
        }

        // 获取监控主机
        MonitoredHost local = MonitoredHost.getMonitoredHost("localhost");
        // 取得所有在活动的虚拟机集合
        Set vmlist = new HashSet(local.activeVms());
        // 遍历集合,输出PID和进程名
        for (Object process : vmlist) {
            MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + process));
            // 获取类名
            String processname = MonitoredVmUtil.mainClass(vm, true);
            if (cls.equals(processname)) {
                return ((Integer) process).intValue();
            }
        }
        return -1;
    }
}           
               
                                           
                       
                 
            
                     
             
               

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/8106.html

相关文章

  • Java获取当前进程ID以及所有Java进程进程ID

    摘要:获取当前进程以及所有进程的进程首先是获取当前运行的进程,这个是网上常见的,也就是程序自身将进程打印出来是一个在运行时管理和监控的工厂类,它能提供很多管理的静态接口,比如是虚拟机的运行时管理接口获取所有正在运行着的进程获取监控主机取得所有在活 Java获取当前进程ID以及所有Java进程的进程ID 首先是获取当前Java运行的Java进程ID,这个是网上常见的,也就是Java程序自身将...

    stormzhang 评论0 收藏0
  • Java多线程笔记(零):进程、线程与通用概念

    摘要:父进程调用创建子进程。因而,一个进程的第一个线程会随着这个进程的启动而创建,这个线程被称为该进程的主线程。另一方面,线程不可能独立于进程存在。终止线程线程可以通过多种方式来终结同一个进程中的其他线程。 前言 不积跬步,无以至千里;不积小流,无以成江海。在学习Java多线程相关的知识前,我们首先需要去了解一点操作系统的进程、线程以及相关的基础概念。 进程 通常,我们把一个程序的执行称为一...

    blastz 评论0 收藏0
  • 进程,线程讲到AsyncTask

    摘要:系统创建好进程后,实际上就启动执行了该进程的主执行线程。也就是说,对线程来说,进程相当于一个容器,可以有许多线程同时在一个进程里执行。默认情况下,同一应用程序下的所有组件都运行在相同的进程和线程一般称为程序的主线程中。 一 前言 异步编程是android初学者的一个难点,却也是始终不能绕过的一个坎。可以说几乎每个app都逃不了网络编程,而网络编程又往往建立在异步的机制之上(你不应该也无...

    姘存按 评论0 收藏0
  • 进程,线程讲到AsyncTask

    摘要:系统创建好进程后,实际上就启动执行了该进程的主执行线程。也就是说,对线程来说,进程相当于一个容器,可以有许多线程同时在一个进程里执行。默认情况下,同一应用程序下的所有组件都运行在相同的进程和线程一般称为程序的主线程中。 一 前言 异步编程是android初学者的一个难点,却也是始终不能绕过的一个坎。可以说几乎每个app都逃不了网络编程,而网络编程又往往建立在异步的机制之上(你不应该也无...

    wawor4827 评论0 收藏0
  • 如何查看Java进程和线程?你get了没?

    摘要:命令菜鸟教程命令菜鸟教程提供一个测试类,为防止线程运行结束,代码中使用了循环,同时防止完全占用,使用睡眠秒,让出执行时间。  备战2022春招或暑期实习,祝大家每天进步亿点点!Java并发编程Day5本篇总结的是 如何在Java中避免创建不必要的对象,后续会每日更新~关于《我们一起学Redi...

    不知名网友 评论0 收藏0

发表评论

0条评论

roland_reed

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<