【发布时间】:2015-06-04 08:01:19
【问题描述】:
我有一个 java 应用程序在后台启动另一个 java 应用程序(第三方),所以在启动第三方后台应用程序之前,我想检查该应用程序是否已经在运行(不想等待终止该应用程序)。
我正在使用以下代码来启动第三方 java 应用程序:
String path = new java.io.File("do123-child.cmd").getCanonicalPath();
Runtime.getRuntime().exec(path);
注意:文件“do123-child.cmd”调用“.bat”文件来运行该应用程序。
要检查给定的应用程序是否正在运行,我使用以下代码 [Ref link]:
boolean result = false;
try {
String line;
Process p = Runtime.getRuntime().exec("tasklist.exe");
BufferedReader input =
new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
if(line.startsWith("myApp.exe")){
result = true;
break;
}
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
return result;
我想知道是否有其他方法可以在不迭代当前正在运行的所有进程的情况下做到这一点?喜欢:
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。
提前致谢。
【问题讨论】:
-
@MichaelLaffargue :在给定的链接(由你)代码中等待进程/应用程序的终止,但在我的场景中我不想等待应用程序的终止,我只是想知道应用程序是否正在运行。
-
我的坏@Bhushan。
tasklist是在 Windows 上的方式(除非你想使用 JNA ) -
@MichaelLaffargue :实际上我不想使用
JNA因为我的应用程序同时适用于 windows 和 MAC ,上面的代码将适用于两者,只是我必须将命令"tasklist.exe"更改为特定于 mac , 表示命令将根据操作系统类型决定,但逻辑相似(尚未在 MAC 上尝试过此代码)。