我有一个swing应用程序,我正在执行一个jar文件,它将在内部进行一些处理。我的流程如下: 1.一个带有main()的java文件,它加载swing GUI。从该GUI我可以浏览并加载所需的jar文件来执行。
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
MigrationProcessElementDialog.createAndShowGUI();
}
});
}
Runtime rt = Runtime.getRuntime();
// replacePath is the path of the jar file to be loaded.
Process proc = rt.exec("java -jar " + replacePath);
int exitVal = proc.waitFor();
当我触发执行时,从我看到的任务管理器,两个javaw.exe(一个用于eclipse,一个用于SWING GUI)和一个java.exe用于程序流。 但是程序流程会持续几次(从日志更新中显而易见)但在一段时间后会停滞不前。
一旦我杀了我的swing GUI javaw.exe;程序流程启动并立即继续执行其余部分。所以在我看来,某种程度上javaw.exe阻止了java.exe的执行。它可能吗?它的解决方案是什么?
如果我执行,我的进程可执行jar从命令提示符使用普通的java -jar" path"命令,程序流程没有停滞,它按预期工作。
仅在从GUI执行或使用运行时执行时遇到问题。我也使用过ProcessBuilder;但面临同样的问题。
如果有人可以给我任何线索,那将是非常有帮助的。谢谢!
答案 0 :(得分:1)
您应该处理进程的输出(stdout,stderr)。因为,这些输出将通过三个流(getOutputStream(),getInputStream(),getErrorStream())重定向到父进程。如果不处理,它将在子进程产生输出时阻塞。
某些本机平台仅提供 标准输入和输出流的缓冲区大小有限,失败 及时写入输入流或读取输出流 子进程可能导致子进程阻塞,甚至死锁。