检查应用程序是否正在使用java运行?

检查应用程序是否正在使用java运行?,java,windows,process,Java,Windows,Process,我有一个java应用程序,它在后台启动另一个java应用程序(第三方),因此在启动第三方后台应用程序之前,我想检查该应用程序是否已经在运行(不想等待该应用程序的终止)。 我使用以下代码启动第三方java应用程序: String path = new java.io.File("do123-child.cmd").getCanonicalPath(); Runtime.getRuntime().exec(path); 注意:文件“do123 child.cmd”调用.bat文件以运行该应用程序。

我有一个java应用程序,它在后台启动另一个java应用程序(第三方),因此在启动第三方后台应用程序之前,我想检查该应用程序是否已经在运行(不想等待该应用程序的终止)。
我使用以下代码启动第三方java应用程序:

String path = new java.io.File("do123-child.cmd").getCanonicalPath();
Runtime.getRuntime().exec(path);
注意:文件“do123 child.cmd”调用.bat文件以运行该应用程序。

要检查给定的应用程序是否正在运行,我使用以下代码[]:

我想知道是否有其他方法可以在不迭代当前运行的所有进程的情况下执行此操作?比如:

Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq myApp.exe\" /NH");
int exitVal = p.exitValue();
//if above code throw "java.lang.IllegalThreadStateException" means application is running.
但是上面的代码为所有应用程序返回0。

提前感谢。

您可以使用它来检查正在运行的Java应用程序
jps
与JRE捆绑在一起

jps -l
19109 sun.tools.jps.Jps
15031 org.jboss.Main
14040 
14716
您可以使用
Runtime.getRuntime().exec()
从该程序中刮取列表,然后在Java中搜索包名以查找匹配项

由于您希望避免重复所有结果,因此可以使用
findstr
对结果进行grep,以返回您要查找的基本
p.exitValue()
结果:

Process p = Runtime.getRuntime().exec("jps -l | findstr /R /C:\"com.myapp.MyApp\"");
int exitVal = p.exitValue(); // Returns 0 if running, 1 if not
当然
findstr
是特定于Windows的,因此您需要在Mac上使用
grep

Process p = Runtime.getRuntime().exec("jps -l | grep \"com.myapp.MyApp\"");
int exitVal = p.exitValue(); // Returns 0 if running, 1 if not
jps
工具使用一个内部API()来获取此信息,因此您也可以完全在Java中执行此操作:

String processName = "com.myapp.MyApp";

boolean running = false;
HostIdentifier hostIdentifier = new HostIdentifier("local://localhost");

MonitoredHost monitoredHost;
monitoredHost = MonitoredHost.getMonitoredHost(hostIdentifier);

Set activeVms = monitoredHost.activeVms();
for (Object activeVmId : activeVms) {
    VmIdentifier vmIdentifier = new VmIdentifier("//" + String.valueOf(activeVmId) + "?mode=r");
        MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmIdentifier);
    if (monitoredVm != null) {
        String mainClass = MonitoredVmUtil.mainClass(monitoredVm, true);
        if (mainClass.toLowerCase().equals(processName.toLowerCase())) {
            running = true;
            break;
        }
    }
}

System.out.print(running);

@MichaelLaffargue:在给定的链接(由您编写)代码中,等待进程/应用程序的终止,但在我的场景中,我不想等待应用程序的终止,我只想知道应用程序是否正在运行。我的坏@Bhushan
tasklist
是在Windows上运行的方式(除非你想使用)@MichaelLaffargue:实际上我不想使用
JNA
,因为我的应用程序同时适用于Windows和MAC,上面的代码将同时适用于这两种应用程序,只要我必须将命令
“tasklist.exe”
更改为MAC专用,意味着命令将根据操作系统类型决定,但逻辑将类似(但尚未在MAC上尝试此代码)?这就是OP想要的,只是为了完善我的知识。是的,这只适用于JVM进程。如果要监视非Java应用程序,则需要使用不同的解决方案。@seanhodges:String processName=“com.myapp.myapp”
“com.myapp.myapp”
是ImageName还是类名?若它是类名,那个么我怎么知道另一个java应用程序(第三方)的类名呢?这很简单。上面的示例显示了“org.jboss.Main”,它表示一个jboss实例。如果包名不明显,则在应用程序关闭后再打开的情况下运行
jps-l
——新进程将在第一个列表中丢失,但在第二个列表中可见。
String processName = "com.myapp.MyApp";

boolean running = false;
HostIdentifier hostIdentifier = new HostIdentifier("local://localhost");

MonitoredHost monitoredHost;
monitoredHost = MonitoredHost.getMonitoredHost(hostIdentifier);

Set activeVms = monitoredHost.activeVms();
for (Object activeVmId : activeVms) {
    VmIdentifier vmIdentifier = new VmIdentifier("//" + String.valueOf(activeVmId) + "?mode=r");
        MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmIdentifier);
    if (monitoredVm != null) {
        String mainClass = MonitoredVmUtil.mainClass(monitoredVm, true);
        if (mainClass.toLowerCase().equals(processName.toLowerCase())) {
            running = true;
            break;
        }
    }
}

System.out.print(running);