我正在Java应用程序中启动外部应用程序(8u11)。但是,对于使用标准沙漏/微调器的Windows XP和Windows 7下的UI输入,应用程序无响应。
我已经将这个问题缩小到我是否使用Process.waitFor()。如果我打电话给它,我会看到问题,如果我不这样做就行了。如果我退出Java应用程序,应用程序也会解冻。
我的问题是为什么会出现这种情况 - 如何调用waitFor()可能会影响子进程的内部运行?我该如何避免这个问题?
有问题的应用程序是LinPhone.exe,但我不认为该问题是特定于应用程序的 - 必须有一些通用的方式来处理标准IO等,这是我通过调用waitFor干扰的方式)。
我需要使用Process.waitFor(),以便我可以跟踪应用程序何时退出。
我已将问题简化为此SCCEE。
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);
}
}
答案 0 :(得分:0)
总结讨论,我没有处理标准错误流导致linphone锁定,因为标准错误的输出缓冲区变满了,特别是因为linphone在标准错误上产生了大量冗长的输出。 When RunTime.exec wont提供了从Java调用进程所涉及的陷阱的精彩摘要。
还有一个拼写错误,我打电话给非标准名为getter
processBuilder.redirectErrorStream();
当我应该打电话给" setter"
时processBuilder.redirectErrorStream(true);