2012-08-10 3 views
7

ライブラリがシャットダウンされたときにスレッドを正しくクリーンアップしないサードパーティのライブラリを扱う際の回避策はありますか?スレッドを停止しない悪い振る舞いのライブラリを処理する方法

多くのライブラリは、そこに含まれるコードに対して、明示的または暗黙的にライフサイクルメソッドを公開しています。たとえば、Webアプリケーションフレームワークは、サーブレットコンテナ内のWebアプリケーションコンテキスト内に存在します。コンテキストが作成されると、さまざまな理由でフレームワークがいくつかのスレッドを開始することがあります。

サーブレットコンテナまたはWebアプリケーションコンテキストがシャットダウンされると、Webアプリケーションフレームワークはこれらのスレッドをすべて終了する必要があります。ライブラリによって作成されたExecutorServiceのいずれかをシャットダウンするか、またはこれらのスレッドを停止する他の手段を実行する必要があります。

最悪の場合、スレッドはnon-daemon threadsです。これらは、実際にJavaプロセスの終了を停止します。しかし、それらがデーモンスレッドであっても、スレッドを続行できるようにすることはおそらく悪い習慣です。 (例に戻って)サーブレットコンテナが他のコード内に埋め込まれていれば、他のコードは引き続き実行され、問題を引き起こす可能性があります。

これらのスレッドを停止するためのプログラム的な方法はないので、何ができるのですか?

このようなサードパーティライブラリを使用している場合、既存のスレッドを強制的にシャットダウンする方法は何ですか?

答えて

5

このようなサードパーティライブラリを使用している場合、既存のスレッドを強制的にシャットダウンする方法はありますか?

通常、すべての場合に機能することが保証されている安全な方法はありません。あなたが安全な解決策に近づく可能性が最も高いのは、ThreadGroupを使用して既存のすべてのスレッドを列挙し、Thread.interrupt()を使用して各スレッドに停止を指示することです。もちろん、スレッドが注意を払うという保証や、割り込みに応答して正常にシャットダウンする保証はありません。

IMO、最善の戦略は次のとおりです。

  • スレッドがシャットダウンする必要がない場合はきれいが、その後にSystem.exit()を呼び出すことにより、JVM上のプラグを引っ張る

  • 破損の可能性を避けるためにスレッドをきれいにシャットダウンする必要がある場合は、ライブラリを使用しないでください。

+3

+1ライブラリを実行すると、プロセスを強制終了することによる影響を減らすことができます。 (JNI図書館も同様) –

+0

ありがとう@Stephen。はい、ここで説明するように、すべてのスレッドとスレッドグループを取得できます。http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java System.exit()は、スレッドを作成していたライブラリがそのプロセスの「ファーストクラス」コードとみなされる場合にのみ機能します。ライブラリが*コードで単純に使用されているなら、それはいいことではありません。 –

+1

@Peterはもちろんライブラリに依存しています...別のプロセスで実行すると通信が難しくなります。 –

関連する問題