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



我一直在实施一个程序来编译和运行其他应用程序。我想知道,当我的应用程序发现存在问题时,是否有办法终止程序。无限循环。我尝试使用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. 使用" taskist"命令获取该过程的PID。需要CSV解析器。我相信有很多可用的可用,例如org.apache.commons.csv.csvparser等
  3. 使用PID命令杀死该过程。

这是代码的某些部分,可能有用:

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

相关内容

  • 没有找到相关文章

最新更新