我正在尝试从java app执行外部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);
但这是一种难看的解决方案。有没有更好的想法?
答案 0 :(得分:2)
以上看起来非常可疑。你将产生你的过程,然后立即测试它。进程本身可能尚未确定它是否运行正常(例如,它何时实际检查jar文件eixsts /是否可加载/有效?)
我认为你最好通过新线程产生进程,通过Process.waitFor()
在该线程中调用/阻塞然后通知父线程(通过任何方式 - 状态变量,wait()
/ notify()
,java.util.concurrent.Future
等等。一旦流程退出,您就收集了退出状态。
Apache Commons Exec是用于执行此类工作的有用库,包括异步生成/进程退出通知。有关详细信息,请参阅DefaultExecuteResultHandler。
答案 1 :(得分:2)
似乎没有优雅的解决方案。例如。我在我的电脑上运行你的代码并获得了“成功”,尽管它上面没有ExtApp.jar。也就是说,从Runtime.exec的角度来看,无论后来发生什么,进程(java.exe)都会成功启动。