7

私の Java プログラムは ProcessBuilder (redirectErrorStream を true に設定) を使用し、ブロックしているプロセスの入力ストリームの read メソッドを実行するループを持っています。私が呼び出している外部プログラムは、入力と標準入力の待機を停止します。私は今、プロセスを殺したいと思っています。これは、(別のスレッドで) プロセスの destroy メソッドを呼び出し、入力ストリームの close メソッドを呼び出して read メソッドのブロックを停止し、最初のスレッドが寿命を尽くすようにすることによって行われませんか?

なぜかprocess.getInputStream().close()ブロック。JavaDoc から、なぜこれが起こるのかわかりません。さらに、javadoc に「InputStream の close メソッドは何もしない」と記載されている理由がわかりません。( javadoc へのリンク) 誰か説明してくれませんか?

ありがとう :-)

4

4 に答える 4

4

ブロッキング動作に関して、Java には既知の問題があり、別のプロセスとの通信時にデッドロックが発生する可能性があります。これがあなたが見ているものかどうかはわかりませんが、調べる価値があります。java.lang.Processのドキュメントには次のように書かれています。

一部のネイティブ プラットフォームでは、標準の入力ストリームと出力ストリームに対して限られたバッファー サイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りが迅速に行われないと、サブプロセスがブロックされたり、デッドロックが発生したりする可能性があります。

于 2009-03-14T23:57:40.087 に答える
3

私はこれを理解したと思います。明らかに、process.getInputStream().close() および process.getErrorStream().close() の前に process.getOutputStream().close() を呼び出すことが重要です。

于 2009-03-15T11:35:44.107 に答える
3

何らかの理由で process.getInputStream().close() がブロックされます。JavaDoc から、なぜこれが起こるのかわかりません。さらに、javadoc に「InputStream の close メソッドは何もしない」と記載されている理由がわかりません。(javadocへのリンク)誰かがこれを説明できますか?

Javadoc を見ると、InputStream が抽象クラスであることがわかります。InputStream を拡張するサブクラスは、close() メソッドをオーバーライドすることが期待されます (必要な場合)。明らかに、使用している InputStream サブクラスは close メソッドで何かを行います。

于 2009-03-14T23:50:01.277 に答える
3

jdigital が書いたものに追加して、この記事を確認してください。Runtime.exec()これはメソッドを扱いProcessBuilder、Java 5 で導入されましたが、この議論は一般的なシステム プロセスに当てはめることができるように思えます。

于 2009-03-15T00:10:48.667 に答える