3

を使用して Windows で外部プログラムを呼び出そうとしていますRuntime.getRuntime().exec(...)が、デッドロックが発生しているようです。外部プロセスは非同期で開始されますが、しばらくすると何もしなくなります。Java スレッドを停止すると、外部プロセスが続行されるため、何らかの方法で Java スレッドを待機している必要があります。これは現時点で関連するコードです。

try {
    Process process = Runtime.getRuntime().exec(System.getProperty("user.dir") + "program.exe");
    BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); //Read output of program from its buffer.
    String line;
    while((line = input.readLine()) != null) {
        System.out.println(line);
    }
    process.waitFor();
} catch(IOException e) {
    e.printStackTrace();
} catch(InterruptedException e) {
    e.printStackTrace();
}

プログラムは 3313 バイトを出力した後に停止します。バッファを空にするさまざまな方法を試しました。この問題が発生する場合があるためです。

Java プログラムは外部プログラムが完了するのを待っています ( process.waitFor())。外部プログラムは Java プログラムを終了するまで完了しないため、デッドロックが発生します。どうすればこれを防ぐことができますか? 外部プログラムのソースにはアクセスできません。

4

2 に答える 2

0

Java プログラムは外部プログラムが完了するのを待っています (process.waitFor())。外部プログラムは Java プログラムを終了するまで完了しないため、デッドロックが発生します。どうすればこれを防ぐことができますか?

防ぐことはできません。Javaのドキュメントによると

サブプロセスがまだ終了していない場合、呼び出しスレッドはサブプロセスが終了するまでブロックされます。

于 2013-10-10T10:59:36.883 に答える