- ベストアンサー
Javaにおけるサブプロセスの待ち方
- Javaでサブプロセスを実行し、標準出力から文字列を取得するプログラムがフリーズする現象が発生します。
- フリーズする原因は、サブプロセスの終了を待つps.waitFor()メソッドで止まっているためです。
- この現象は、特定の条件下で起こる可能性があり、Javaのバグである可能性があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Process の各 InputStream の読込みを行わないと、子プロセスの標準出力または標準エラー出力のデータ量が多い場合にバッファーが満杯になり、ブロックしてしまうことが有ります。 ↓の「ネイティブなプラットフォームには・・・」の部分を参照して下さい。 http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Process.html 仕様・・・というか、その様な実装が許されていることになるのかと。 また、バッファーサイズは個々のJVMの実装によると思いますが、かなり小さいことが多いようです。 標準出力/標準エラー出力それぞれの読込みスレッドを作って読込ませることで一応の解決にはなります。 確かに不便ですね・・・。 下記のページも参考になるかと。 http://www.ne.jp/asahi/hishidama/home/tech/java/process.html#h4_NG_after http://blog.livedoor.jp/applepedlar/archives/51979434.html http://isolinear.info/wiki/index.php/Java/Tips/Java%A4%C7%A1%A4%BB%D2%A5%D7%A5%ED%A5%BB%A5%B9%A4%F2%BB%C8%A4%A6%A4%C8%A4%AD%A4%CE%C3%ED%B0%D5%C5%C0.html
その他の回答 (1)
- いけだ ひろし(@ike-2000)
- ベストアンサー率53% (69/129)
参考程度に読んでください。 最近はJavaから離れているので定かではないのですが、Windowsプラットフォームでは別スレッドでストリームを読んでやる必要があったような気がします。 Java1.5頃の開発なので最近は違うかもしれませんがWindowsではプロセスの制御がうまくなく(Javaかも)別スレッドにしてやらないとデッドロックになったと記憶しています。 苦労した記憶が残っているのでやってみる価値が少しはあると思います。 参考まで。
お礼
ご回答ありがとうございます。 とりあえず、別スレッドを使って読むことに成功しました。