0

プログラムから外部 Java プロセスを呼び出しています。その生成されたプロセスによって生成された出力を次のように消費しています。

DataInputStream dis = new DataInputStream(new BufferedInputStream(myProcess.getInputStream()));

スレッドから私は次のことをしています:

            while (dis.available() != 0) 
            {                   

                firstMesg = dis.readLine();


                if(firstMesg != null) 
                {
                    // processing with the message
                    //System.out.println(firstMesg);    
                }                                                                       
            } 


            try 
            {
                Thread.currentThread().sleep(SLEEP_TIME);
            }
            catch(Throwable e) 
            {
            }

SLEEP_TIME を約 1 分与えていましたが、すべて正常に機能していました。突然、特定のセットアップで、Sys out (System.out.println) が生成されたプロセスから非常に長い時間がかかっていることがわかりました。

何が起こったのか誰か教えてくれませんか?これら 2 つのプロセスは独立している必要があります。ただし、呼び出し元は、呼び出されたプロセスからの読み取りを保持しています。ただし、呼び出されたプロセスが書き込みを行っている場所のバッファは大きくする必要があります。したがって、ブロックされる必要はありません。

これは、ProcessBuilder Java ドキュメントで確認できます。

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

4

3 に答える 3

1

NuProcessライブラリを見てみましょう。生成されたプロセスにノンブロッキング (非同期) I/O を提供します。 免責事項: 私は NuProcess の作成者です

于 2013-11-20T03:30:15.650 に答える