Java 检查外部长期jar是否成功启动的优雅方式
我正在尝试从java应用程序执行外部jar 检查流程是否已成功启动并运行的最优雅方式是什么? ExtApp.jar是一个长期运行的进程,所以我不能使用Java 检查外部长期jar是否成功启动的优雅方式,java,exception,process,jar,exit-code,Java,Exception,Process,Jar,Exit Code,我正在尝试从java应用程序执行外部jar 检查流程是否已成功启动并运行的最优雅方式是什么? ExtApp.jar是一个长期运行的进程,所以我不能使用process.waiFor(),因为它会阻塞我的应用程序。我提出了以下代码,其背后的想法是,如果进程尚未终止,exitValue()抛出IllegalThreadStateException boolean success = false; try { Process process = Runtime.getRuntime().exec
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);
但这是一种丑陋的解决方案。有没有更好的主意?以上这些似乎很可疑。您将从您的流程中派生,然后立即对其进行测试。进程本身可能尚未确定其运行是否正常(例如,它实际上何时检查jar文件eixsts/是否可加载/是否有效?) 我认为最好通过一个新线程生成进程,通过
process.waitFor()
调用/阻塞该线程,然后通知父线程(通过任何方式-状态变量,wait()
/notify()
,ajava.util.concurrent.Future
等)一旦流程退出并且您收集了退出状态
是执行此类工作的有用库,包括异步生成/进程退出通知。有关更多信息,请参阅。以上内容似乎非常可疑。您将从您的流程中派生,然后立即对其进行测试。进程本身可能尚未确定其运行是否正常(例如,它实际上何时检查jar文件eixsts/是否可加载/是否有效?) 我认为最好通过一个新线程生成进程,通过
process.waitFor()
调用/阻塞该线程,然后通知父线程(通过任何方式-状态变量,wait()
/notify()
,ajava.util.concurrent.Future
等)一旦流程退出并且您收集了退出状态
是执行此类工作的有用库,包括异步生成/进程退出通知。有关更多信息,请参阅。该问题似乎没有优雅的解决方案。例如,我在我的电脑上运行了你的代码,虽然上面没有ExtApp.jar,但获得了“成功”。也就是说,从Runtime.exec的角度来看,无论之后发生什么,进程(java.exe)都成功启动 这个问题似乎没有优雅的解决办法。例如,我在我的电脑上运行了你的代码,虽然上面没有ExtApp.jar,但获得了“成功”。也就是说,从Runtime.exec的角度来看,无论之后发生什么,进程(java.exe)都成功启动 这是一个长期的过程,它不会退出。这是一个长期的过程,它不会退出。你是对的。这是一个时间问题。如果使用调试器检查代码,并且ExtApp.jar不存在,它会显示
false
,如果不是从调试器运行,它会显示true
。对,这就是我的意思,计时并不优雅,因为你永远不知道在做出决定之前要等待多长时间。你是对的。这是一个时间问题。如果使用调试器检查代码,并且ExtApp.jar不存在,它会显示false
,如果不是从调试器运行,那么它会显示true
。对,这就是我的意思,计时并不优雅,因为你永远不知道在做出决定之前要等待多长时间