我使用ProcessBuilder从java应用程序(主机)启动一个新进程(子进程)。像这样:
ProcessBuilder processBuilder = createProcess(commandLine);
processBuilder.directory(new File(baseDir));
processBuilder.redirectErrorStream(true);
Process process = null;
try {
process = processBuilder.start();
} catch (Exception e) {
e.printStackTrace();
}
我确实在系统监视器中看到子进程已启动,但除非我停止主机应用程序,否则它无法运行。更具体地说,子proecess是一个服务器,在使用ProcessBuilder启动后,如果主机应用程序仍在运行,它就不会响应请求。此外,服务器正在使用的端口仍然可用。如果我停止主机应用程序,服务器立即开始工作。有什么我错过的或者ProcessBuilder的工作原理是什么? 提前谢谢了。
答案 0 :(得分:2)
在大多数情况下,在清空进程的标准输出缓冲区之前,它不会终止。可能是您的进程已填充此缓冲区并已停止(由于某种原因)
尝试使用标准流程(通过Process#getInputStream
),看看是否有所作为。
也可能是进程正在等待用户的输入。
查看I'm not getting any output and probably the machine hangs with the code示例
答案 1 :(得分:0)
@MadProgrammer是正确的。我能够解决这个问题,我想用代码示例回答我的问题。这也可能对其他人有用。 启动后,您需要使用子进程中的标准。像这样:
process = processBuilder.start();
InputStream is = process.getInputStream();
INputStreamReadr isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while (!stopProcess) {
if (br.ready()) {
line = br.readLine();
System.out.println(line);
}
}