1

32ビットプロセスAがあり、64ビットプロセスで実行する必要がある別のJavajarを開始する必要があります。それらはソケットを介して通信します。このシステムは正常に動作します。

ただし、まれに、2番目のプロセス(B)が、それを起動するプロセス(A)を閉じるまでハングすることがあります。この問題をデバッグしているときに、プロセスBの入力ストリームを読み取って、出力されているメッセージを確認し、プロセスBの入力ストリームから読み取ることで問題が解決したことを確認しました。したがって、プロセスBの入力ストリームのみを読み取るダムスレッドにまたがり、すべてが正常に機能しました。

問題は非常に奇妙でしたが、先に進む必要がありました。コンソールの出力バッファサイズなどと関係があると思いました。しかし、開始されたプロセスの入力ストリームを読み取ったにもかかわらず、この問題が新しくインストールされたマシンで発生するのを確認しました(B)。

非常にまれにしか発生しませんが、なぜこれが発生するのかを絶対に確認したいと思います。理由は何でしょうか?私たちが気付いていないデフォルト設定はありますか?あなたは以前にそのようなケースに遭遇したことがありますか?

簡単な要約:

  • プロセスAは32ビットプロセスで実行されます
  • プロセスBは64ビットプロセスで実行されます
  • プロセスAは、64ビットのjavaw.exeをポイントしてRuntime.execを発行することにより、プロセスBを開始します。
  • プロセスBは、プロセスAを閉じるまでハングします
  • プロセスBがタスクマネージャーに表示されます
4

2 に答える 2

2

スポーンされたプロセスからstadoutとstderrの両方を消費する必要があり、これを同時に行う必要があります。そうしないと、スポーンされたプロセスは、親プロセスがその出力を消費するのを待つのをブロックできます。

詳細はこちら

于 2012-11-21T15:33:31.250 に答える
0

プロセスハングの問題がありました。私にとっては、生成されたサブプロセスからのstdoutログとstderrログが必要でした。親プロセスからの読み取りブロッキング呼び出し「readLine()」の使用により、生成されたサブプロセスがハングしていました。次のコードは私にとって問題を引き起こしていました。

   BufferedReader processInputReader =  new BufferedReader(new InputStreamReader(process.getInputStream()));
       while ((line = processInputReader.readLine()) != null){
           bw.write(line+"\n"); //write to temp file 
       }
       processInputReader.close();

       //get error stream
       processInputReader =  new BufferedReader(new InputStreamReader(process.getErrorStream()));
       while ((line = processInputReader.readLine()) != null){
           bw.write(line+"\n"); //write to temp file 
       }
       processInputReader.close();

https://ostermiller.org/utils/src/ExecHelper.java.htmlを参照して、ストリーム読み取りロジックを変更しました。現在、ハングの問題は発生していません。

于 2018-02-06T05:47:29.187 に答える