1

Java GUI から外部アプリケーションを呼び出しています。ユーザーが GUI で [RUN] ボタンを押したときの Java コードは次のとおりです。

Runtime runme = Runtime.getRuntime();
runme.exec("MyApp.bin");

MyApp.bin はいくつかの数学計算を行い、その中にいくつかのループがあります - 大したことではありません。何が起こるかというと、MyApp.bin が動かなくなってしまうのです! Java GUI を閉じると、MyApp.bin が引き続き実行されて終了します。端末から MyApp.bin を直接実行すると、フリーズせずに正常に動作します。アプリケーションを Java GUI から実行するとフリーズし、Java GUI を閉じると再開するのはなぜですか? アプリケーションの正常な実行を妨げている Java GUI または Java コードは何をしているのですか?

4

1 に答える 1

4

私はMyApp.bin何かをその標準に出力しているという大げさな推測をするつもりです、そしてあなたはそれを読んでいません。これにより、バッファがいっぱいになり、プロセスがブロックされます。

Runtime.exec()オブジェクトを返しProcessます。そのためのjavadocを読むと、次のことがわかります。

作成されたサブプロセスには、独自のターミナルまたはコンソールがありません。そのすべての標準io(つまり、stdin、stdout、stderr)操作は、3つのストリーム(getOutputStream()、getInputStream()、getErrorStream())を介して親プロセスにリダイレクトされます。親プロセスは、これらのストリームを使用して、サブプロセスに入力を供給し、サブプロセスから出力を取得します。一部のネイティブプラットフォームでは、標準の入力ストリームと出力ストリームに限られたバッファサイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りに失敗すると、サブプロセスがブロックされ、デッドロックが発生する可能性があります。

http://docs.oracle.com/javase/6/docs/api/java/lang/Process.html

于 2012-08-17T04:20:31.907 に答える