使用Process.waitFor()时应用程序停止响应

时间:2014-09-02 15:27:19

标签: java processbuilder linphone

我正在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);
    }

}

enter image description here

1 个答案:

答案 0 :(得分:0)

总结讨论,我没有处理标准错误流导致linphone锁定,因为标准错误的输出缓冲区变满了,特别是因为linphone在标准错误上产生了大量冗长的输出。 When RunTime.exec wont提供了从Java调用进程所涉及的陷阱的精彩摘要。

还有一个拼写错误,我打电话给非标准名为getter

processBuilder.redirectErrorStream();

当我应该打电话给" setter"

processBuilder.redirectErrorStream(true);