2016-06-29 14 views
1

5分以上処理するhavaコマンドライン。 ProcessBuilderでコマンドラインを起動すると、コマンドは5分間でジョブを完了します。5分後にjavaのprocessBuilderがハングするのはなぜですか?

プロセスが5分以上かかるとプロセスがハングし、プロセスを終了するまでプロセスの改善が見られません。

p = new ProcessBuilder("myprogram","with","parameter").start(); 
p.waitFor(); 

上記の質問を理解できない場合は教えてください。

+0

@Matej Kormuthの答えが正しい。プロセスに関連付けられた標準のファイル記述子を処理する必要があります。これを修正する最も簡単な方法は、あなたがJava 7+を使用していると仮定して(初心者のために) 'p = new ProcessBuilder(" myprogram "、" with "、" parameter ")inheritIO()。start();です。 –

答えて

2

"myprogram"というコマンドが出力を生成し、それを読んでいないという問題があります。これは、バッファがいっぱいになるとすぐにプロセスがブロックされ、プロセスが読み込みを続けるのを待つことを意味します。あなたのプロセスは、他のプロセスが完了するのを待っています(プロセスを待っているからではありません...)。これは古典的なデッドロック状況です。

ブロックされないように、プロセス入力ストリームから継続的に読み込む必要があります。

のJavadocは言う:

クラスプロセス

いくつかのネイティブなプラットフォームには、 標準入出力ストリームのために速やかに入力 ストリームを書き込むかの出力ストリームを読み取ることができませ限られたバッファサイズを提供しているのでサブプロセスによってサブプロセスがブロックされ、デッドロックすることさえあります。

プロセスからの入力ストリーム(サブプロセスの出力 パイプへのパイプ)のバッファをクリアできないと、サブプロセスがブロックされる可能性があります。

関連する問題