gpt4 book ai didi

java - 从 Java 启动的子进程使用 waitFor 完成但流未终止

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:56 24 4
gpt4 key购买 nike

我正在使用 Java 的 ProcessBuilder 启动一个子进程,这是另一个必须在单独的 JVM 中运行的 Java 程序。

我启动了两个线程来从进程的 stdout 和 stderr 流中读取数据,这样即使流缓冲区已满也不会挂起。对 Process.waitFor 的调用返回,但流并未终止。

我使用的代码看起来像(命令是一个字符串列表):

ProcessBuilder pb = new ProcessBuilder(command);

final Process p = pb.start();
final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
final ByteArrayOutputStream errStream = new ByteArrayOutputStream();

Thread outputThread = new Thread() {
@Override
public void run() {
try {
IOUtils.copy(p.getInputStream(), outStream);
} catch (IOException e) {
e.printStackTrace();
}
};
};
outputThread.start();

Thread errorThread = new Thread() {
@Override
public void run() {
try {
IOUtils.copy(p.getErrorStream(), errStream);
} catch (IOException e) {
e.printStackTrace();
}
};
};
errorThread.start();

int returncode = p.waitFor();
outputThread.join();
errorThread.join();

如果我运行其他东西,例如“java -version”或“dir”或其他东西,代码工作正常。我可以访问我尝试运行的 Java 代码,但我从未听说过您应该在 System.out 上调用 close()。

最佳答案

Apache commons exec 为您完成这一切。更容易做...

http://commons.apache.org/exec/

关于java - 从 Java 启动的子进程使用 waitFor 完成但流未终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7472821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com