a を使用しProcessBuilder
てプロセスを実行します。入力/出力ストリームを処理するには、スレッド プール ( ) でそれらを処理する対応するランナブルを送信しますExecutors.newCachedThreadPool()
。
私は結果を得ますが、時々何も得られません。
たとえばcmd \C dir
、プロセスビルダーに対してdir
back の結果を取得しますが、何も取得しない場合があります (結果が を処理する実行可能ファイルから返されるように見えるにもかかわらずprocess.getInputStream
)。
どうすればこれをデバッグできますか? 断続的に現れます。同じコードを使用した場合、問題はありませんでしたnew Thread(runnable).start()
。スレッドプールに切り替えた後、発生し始めました。
更新:
何かを見つけたと思います:
で次のことを行いますRunnable
:
try {
while ( (line = br.readLine()) != null) {
pw.println(line);
sb.append(line);
}
System.out.println("Finished reading "+sb.length());
} catch (IOException e) {
e.printStackTrace();
}
finally{
pw.flush();
try{
isr.close();
}catch(Exception e){}
}
うまくいかない場合は、 を出力しFinished reading 521
ます。しかし、私はpw
and notを介して結果を取得しようとしていsb
ます。
pw
ランナブルで渡す PrintWriter pw = PrintWriter(outputStream);` です
更新 2: 次
の
ようです:入力ストリームを処理した実行可能ファイルが終了する前にstatus = process.waitFor();
、より早く戻ります。これはどのように起こりますか?
javadoc: を読みました。つまり、I/O ストリームを消費する 前に戻ることができるということですか?
the calling thread will be blocked until the subprocess exits
更新 3: Ruby
でも
同じ問題のようです。つまり、プロセスの終了と出力の消費の間に競合状態があります。