1

私はこれをかなり長い間グーグルで検索しようとしましたが、成功しませんでした。ここで問題が解決することを願っています。
最初の関数:

public void startTFServer(Channel c) {
    try {
        ProcessBuilder procBuilder = new ProcessBuilder("tfs.exe");
        procBuilder.redirectErrorStream();
        Process proc = null;
        System.out.println(Runtime.getRuntime().freeMemory());
        proc = procBuilder.start();
        System.out.println(Runtime.getRuntime().freeMemory());
        StreamGobbler gobbler = new StreamGobbler(proc.getInputStream(), "STD_OUT");
        gobbler.start();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

プロセス出力をキャプチャするスレッド:

private class StreamGobbler extends Thread {
    InputStream is;
    String type;

    private StreamGobbler(InputStream is, String type) {
        this.is = is;
        this.type = type;
    }

    @Override
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {               
                System.out.println(type + "> " + line);
            }
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

問題: アプリケーションを実行すると、毎回同じ場所で入力が中断されます。「Process クラス」で実行しているアプリケーションは、実行にかなりのメモリを必要とするサーバーです。これが、プロセスがアプリのロードを完了できない理由の 1 つになる可能性がありますか? メモリがなくなると思っていましたが、本当に診断できません。

どんな助けでも大歓迎です!

4

2 に答える 2

2

私が気付く問題が1つあります。

procBuilder.redirectErrorStream();

これはあなたが望むものではありません。これは、redirectErrorStream プロパティの値を通知する getter メソッドです。エラーがあり、読み取られていないためにブロックされている可能性があります。したがって、setter メソッドを使用する必要があります: API を参照してくださいredirectErrorStream(boolean)

procBuilder.redirectErrorStream(true);
于 2013-06-04T00:57:42.823 に答える