Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查外部长期jar是否成功启动的优雅方式_Java_Exception_Process_Jar_Exit Code - Fatal编程技术网

Java 检查外部长期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

我正在尝试从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);

但这是一种丑陋的解决方案。有没有更好的主意?

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

我认为最好通过一个新线程生成进程,通过
process.waitFor()
调用/阻塞该线程,然后通知父线程(通过任何方式-状态变量,
wait()
/
notify()
,a
java.util.concurrent.Future
等)一旦流程退出并且您收集了退出状态


是执行此类工作的有用库,包括异步生成/进程退出通知。有关更多信息,请参阅。

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

我认为最好通过一个新线程生成进程,通过
process.waitFor()
调用/阻塞该线程,然后通知父线程(通过任何方式-状态变量,
wait()
/
notify()
,a
java.util.concurrent.Future
等)一旦流程退出并且您收集了退出状态


是执行此类工作的有用库,包括异步生成/进程退出通知。有关更多信息,请参阅。

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

这个问题似乎没有优雅的解决办法。例如,我在我的电脑上运行了你的代码,虽然上面没有ExtApp.jar,但获得了“成功”。也就是说,从Runtime.exec的角度来看,无论之后发生什么,进程(java.exe)都成功启动

这是一个长期的过程,它不会退出。这是一个长期的过程,它不会退出。你是对的。这是一个时间问题。如果使用调试器检查代码,并且ExtApp.jar不存在,它会显示
false
,如果不是从调试器运行,它会显示
true
。对,这就是我的意思,计时并不优雅,因为你永远不知道在做出决定之前要等待多长时间。你是对的。这是一个时间问题。如果使用调试器检查代码,并且ExtApp.jar不存在,它会显示
false
,如果不是从调试器运行,那么它会显示
true
。对,这就是我的意思,计时并不优雅,因为你永远不知道在做出决定之前要等待多长时间