1

我正在尝试从 java 应用程序执行外部 jar。

检查进程是否已成功启动并运行的最优雅的方法是什么?

ExtApp.jar 是长期运行的进程,所以我不能使用Process.waiFor(),因为它会阻塞我的应用程序。我想出了以下代码,背后的想法是如果进程尚未终止则exitValue()抛出。IllegalThreadStateException

boolean success = false;
try {
    Process process = Runtime.getRuntime().exec("java -jar ExtApp.jar");
    try {
        if (process.exitValue() == 0) 
            success = true;
    } catch (IllegalThreadStateException e) {
        success = true;
    }
} catch (Exception e) {}

System.out.println(success);

但这是一种丑陋的解决方案。有更好的想法吗?

4

2 回答 2

2

这个问题似乎没有优雅的解决方案。例如,我在我的 PC 上运行了您的代码并获得了“成功”,尽管上面没有 ExtApp.jar。也就是说,从 Runtime.exec 的角度来看,进程 (java.exe) 成功启动,无论之后发生什么。

于 2012-12-10T12:23:04.027 回答
2

以上似乎很可疑。您将生成您的流程,然后立即对其进行测试。进程本身可能无法确定它是否运行正常(例如,它何时实际检查 jar 文件 eixsts/是否可加载/是否有效?)

我认为你最好通过一个新线程生成进程,调用/阻塞该线程Process.waitFor(),然后在进程退出后通知父线程(通过任何方式 - 状态变量,wait()/ notify()java.util.concurrent.Future等等)已经收集了退出状态。

Apache Commons Exec是用于执行此类工作的有用库,包括进程退出的异步生成/通知。有关详细信息,请参阅DefaultExecuteResultHandler

于 2012-12-10T12:07:51.090 回答