1

我使用 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();
}

我确实在系统监视器中看到子进程已启动,但除非我停止主机应用程序,否则它无法运行。更具体地说,子进程是一个服务器,在使用 ProcessBuilder 启动它之后,如果主机应用程序仍在运行,它不会响应请求。此外,服务器正在使用的端口仍然可用。如果我停止主机应用程序,服务器会立即开始工作。有什么我错过的或者 ProcessBuilder 应该如何工作的吗?提前谢谢了。

4

2 回答 2

2

在大多数情况下,在进程的标准输出缓冲区被清空之前,它不会终止。可能是您的进程已填满此缓冲区并已停止(出于某种原因)

尝试使用标准输出(通过Process#getInputStream)的流程,看看是否有所作为。

也可能是进程正在等待用户的输入。

看看我没有得到任何输出,可能机器挂起代码作为示例

于 2013-03-08T22:43:06.713 回答
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);
            }
        }
于 2013-03-11T22:35:23.137 回答