0

すべての単体テストに合格する (非常に) マルチスレッド化されたアプリケーションがありますが、IDE またはコマンド ラインから実行すると終了しません。このアプリはマルチスレッド化されているだけでなく、ネイティブ プロセスを実行し、標準エラーと標準出力に書き込みます。問題は、アプリが終了時にハングすることでした。最終的に、単体テストと同じになるまでアプリを縮小しましたが、それでもハングするので、JUnit はコマンド ライン起動ではできないことをしていると考えました。
main(args) の最後で System.exit() を呼び出すと、アプリが終了し、最終的に System.err.close() に進みます。
もちろん、アプリが System.err または System.out を「開く」ことはありません。それらに書き込むだけで、終了時に flush() を呼び出します。64 ビット Windows でのみテストしました。後で Linux でテストします。JVM は Java(TM) SE ランタイム環境 (ビルド 1.6.0_24-b07) です。

JVM が終了しない理由はありますか?

4

2 に答える 2

1

ネイティブプロセスを呼び出すときは、ネイティブプロセスやエラーストリームを完全に読み取るように注意する必要があることを覚えているようです。そうしないと、問題が発生する可能性があります。これを処理するには、スレッドをスポーンする必要があると思います。ちょっとした考え。

于 2011-06-26T23:23:13.637 に答える
0

Linux 上のすべてのプログラムは、ある程度この問題に直面しています。ファイルハンドルが開いているプロセス (そして、ファイルハンドルを特に開いていなくても、システムコマンド操作の 1 つから来たものであることは明らかです) は、すべてのハンドルが閉じられるまで完全に終了しません。現時点で考えられる最良の例は、Java プロセスを開始するスタートアップ スクリプト (bash) が終了しないという職場での問題です。問題は、標準入力 (ファイルハンドル 0) を閉じない2>&1 > /path/to/log &を実行していたことです。&> /path/to/logにチェーンすると、問題が修正されました。&> はすべてのファイルハンドルを意味し、もう一方は stdin と stderr を意味するためです。

あなたの問題は似ており、マルチスレッドであるという事実が問題を悪化させます。

于 2011-06-26T23:26:55.670 に答える