• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaにおけるサブプロセスの待ち方)

Javaにおけるサブプロセスの待ち方

このQ&Aのポイント
  • Javaでサブプロセスを実行し、標準出力から文字列を取得するプログラムがフリーズする現象が発生します。
  • フリーズする原因は、サブプロセスの終了を待つps.waitFor()メソッドで止まっているためです。
  • この現象は、特定の条件下で起こる可能性があり、Javaのバグである可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.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

KSnake
質問者

お礼

ご回答ありがとうございます。 とりあえず、別スレッドを使って読むことに成功しました。

その他の回答 (1)

回答No.1

参考程度に読んでください。 最近はJavaから離れているので定かではないのですが、Windowsプラットフォームでは別スレッドでストリームを読んでやる必要があったような気がします。 Java1.5頃の開発なので最近は違うかもしれませんがWindowsではプロセスの制御がうまくなく(Javaかも)別スレッドにしてやらないとデッドロックになったと記憶しています。 苦労した記憶が残っているのでやってみる価値が少しはあると思います。 参考まで。

関連するQ&A