Java一直在等待getRuntime()。exec

时间:2014-01-03 14:37:07

标签: java runtime exec wait

我正在我的程序中构建某种更新程序功能。检测到更新时,程序应下载updater.jar并终止。之后,updater.jar将下载该程序的新版本并删除旧版本。这是我的主程序运行更新程序的方式:

Runtime.getRuntime().exec("java.exe -jar updater.jar "+updateURL+" "+workingPath);
System.exit(0);

但是,出于某种原因,在更新程序完成之前,System.exit(0)不会被调用...并且更新程序在运行时无法删除旧版本的主程序。结果:一切都开始挂起

在调用System.exit(0)之前,任何人都知道如何告诉我的主程序/不等待更新程序终止?

修改

FileUtils.copyURLToFile(url, file);
System.out.println("Downloading updater...");
new Thread() {
    public void run() {
        try {
            Runtime.getRuntime().exec("java.exe -jar updater.jar "+updateURL+" "+workingPath);
        } catch (IOException ex) {
            System.out.println("Exception: " + ex.getMessage());
        }
    }
}.start();
System.out.println("Shutting down application.");
System.exit(0);

Cmd显示"Shutting down application.",但jar似乎没有关闭,直到我手动终止该进程。

5 个答案:

答案 0 :(得分:0)

尝试使用Apache Common Exec。它具有异步执行过程的能力。

另一种选择是运行

Runtime.getRuntime().exec("java.exe -jar updater.jar "+updateURL+" "+workingPath);

在使用Runnable / Callable的单独主题中。此外,您可以查看this SO thread(显示如何使用ProcessBuilder)。

答案 1 :(得分:0)

我认为你可以这样使用ProcessBuilder;

String[] cmd = { "java.exe", "-jar", "updater.jar", updateURL, workingPath };
ProcessBuilder pb = new ProcessBuilder(cmd);
try {
  Process p = pb.start();
} catch (IOException e) {
  e.printStackTrace();
}
System.exit(0);

您也可以像SwingUtilities一样使用invokeLater()

javax.swing.SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    Runtime.getRuntime().exec(
      "java.exe -jar updater.jar " + updateURL + " "
          + workingPath);
    }
  }
);

答案 2 :(得分:0)

运行updater.jar的JVM进程与运行Runtime.exec(..)命令的JVM进程不同。如果您想等待updater.jar进程完成(或在超时后终止它),请查看Process.waitFor()

答案 3 :(得分:0)

我通过抛出未捕获的异常来修复它。它使程序退出,更新程序可以继续其业务。

也许不是最漂亮的方式,但它有效:)

答案 4 :(得分:0)

找到问题的根源:

我的构造函数调用了我的checkForUpdate(),在构造函数修复了整个东西之后调用它。罐子现在关闭并正确更新:)