Java 使用Process.waitFor()时,应用程序停止响应
我正在从Java应用程序(8u11)中启动一个外部应用程序。但是,在Windows XP和Windows 7下,应用程序对用户界面输入没有响应,并使用标准的计时玻璃/微调器 我已经将这个问题缩小到是否使用Process.waitFor()。如果我叫它,我会看到问题,如果我不叫它,它工作得很好。如果我退出Java应用程序,应用程序也会取消冻结 我的问题是为什么会这样——调用waitFor()如何可能影响子进程的内部运行?我怎样才能避免这个问题呢 正在讨论的应用程序是LinPhone.exe,但我不认为这个问题是特定于该应用程序的-它必须有一些通用的方式来处理标准IO等,我通过调用waitFor()来干扰这些方式 我需要使用Process.waitFor()以便跟踪应用程序何时退出 我已经把这个问题简化为这个问题Java 使用Process.waitFor()时,应用程序停止响应,java,processbuilder,linphone,Java,Processbuilder,Linphone,我正在从Java应用程序(8u11)中启动一个外部应用程序。但是,在Windows XP和Windows 7下,应用程序对用户界面输入没有响应,并使用标准的计时玻璃/微调器 我已经将这个问题缩小到是否使用Process.waitFor()。如果我叫它,我会看到问题,如果我不叫它,它工作得很好。如果我退出Java应用程序,应用程序也会取消冻结 我的问题是为什么会这样——调用waitFor()如何可能影响子进程的内部运行?我怎样才能避免这个问题呢 正在讨论的应用程序是LinPhone.exe,但我不
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class LinphoneTest {
public static void main(String[] args) throws IOException,
InterruptedException {
String phoneAppPath = "C:\\Program Files\\Linphone\\bin\\linphone.exe";
ProcessBuilder processBuilder = new ProcessBuilder(phoneAppPath);
// move up from bin/linephone.exe
File workingDir = new File(phoneAppPath).getParentFile()
.getParentFile();
processBuilder.directory(workingDir);
processBuilder.redirectErrorStream();
Process process = processBuilder.start();
final BufferedReader stdout = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line = null;
try {
while (((line = stdout.readLine()) != null)) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
new Thread(() -> {
try {
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "process wait").start();
Thread.sleep(Long.MAX_VALUE);
}
}
为了总结讨论,我没有处理标准错误流,导致linphone锁定,因为其标准错误输出缓冲区已满,特别是当linphone产生大量关于标准错误的详细输出时。提供了从Java调用进程所涉及的陷阱的优秀总结 还有一个输入错误,我给非标准的getter打电话
processBuilder.redirectErrorStream();
当我应该叫“塞特”的时候
你是说你正在等待的进程没有响应?请看一看。然后在后台线程中等待。谢谢。我在后台线程上等待,因为它最终是从UI线程触发的,我从SSCCE中删除了这个细节。我会再添加一次,看看是否还能重现这个问题。你在做我链接到的文章中关于流程流的建议吗?如果您不处理它们并且缓冲区内存不足,您可能会中断程序。问题1:您发布的代码会使应用程序长时间处于休眠状态。问题2:你能发布一个我们都可以运行和测试的SSCCE吗?我们大多数人没有linphone.exe。3.您还没有提到如何处理流程的流。
processBuilder.redirectErrorStream(true);