gpt4 book ai didi

java - 如何停止使用其他 Java 程序运行的程序

转载 作者:太空宇宙 更新时间:2023-11-04 15:09:19 24 4
gpt4 key购买 nike

我一直在实现一个程序来编译和运行其他应用程序。我想知道当我的应用程序发现存在问题时是否有办法终止程序,例如无限循环。我尝试使用 process.Destroy() 但它杀死了 CMD,而不是具有无限循环的实际程序...

非常感谢您的帮助。

这是我的代码的一部分:

    synchronized (pro) {
pro.wait(30000);
}

try{
pro.exitValue();

}catch (IllegalThreadStateException ex)
{

pro.destroy();
timeLimitExceededflag = true;
System.out.println("NOT FINISHED123");
System.exit(0);


}

}

基本上,我正在使我的应用程序使用 processBuilder 调用 cmd。此代码终止 CMD,但如果它运行一个具有无限循环的程序,则该应用程序仍将运行,这会影响我的服务器性能。

最佳答案

我建议使用以下解决方案:

  1. 使用指定的标题启动程序
  2. 使用“tasklist”命令获取进程的PID。需要 CSV 解析器。我相信有大量可用的,例如 org.apache.commons.csv.CSVParser 等:)
  3. 使用 PID 通过“taskkill”命令终止进程。

以下是可能有用的部分代码:

public static final String          NL = System.getProperty("line.separator", "\n");

public <T extends Appendable> int command(String... cmd) throws Exception {
return command(null, cmd);
}

public <T extends Appendable> int command(T out, String... cmd) throws Exception {
try {

final ProcessBuilder pb = new ProcessBuilder(cmd);

pb.redirectErrorStream(true);

final Process proc = pb.start();
final BufferedReader rd = new BufferedReader(new InputStreamReader(proc.getInputStream()));

for (;;) {
final String line = rd.readLine();

if (line == null) {
break;
}

if (out != null) {
out.append(line);
out.append(NL);
}
}

return proc.waitFor();

} catch (InterruptedException e) {
throw new IOException(e);
}
}

public void startProcessWithTitle(String pathToExe, String title) throws Exception {
command("cmd.exe", "/C", "start", '"' + pathToExe + '"', '"' + title + '"', ..cmd.params..);
}

public int findProcessByTitle(String title) throws Exception {

final StringBuilder list = new StringBuilder();

if (command(list, "tasklist", "/V", "/FO", "csv") != 0) {
throw new RuntimeException("Cannot get tasklist. " + list.toString());
}

final CSVReader csv = new CSVReader(new StringReader(list.toString()), ',', true, "WindowsOS.findProcessByTitle");
csv.readHeaders(true); // headers

int pidIndex = csv.getHeaderIndex("PID");
int titleIndex = csv.getHeaderIndex("Window Title");

while (csv.nextLine()) {
final String ttl = csv.getString(titleIndex, true);
if (ttl.contains(title)) {
return csv.getInt(pidIndex);
}
}

Utils.close(csv);

return -1;
}

public boolean killProcess(int pid) throws Exception {
return command("taskkill", "/T", "/F", "/PID", Integer.toString(pid)) == 0;
}

关于java - 如何停止使用其他 Java 程序运行的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21548276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com