8

ライブラリのシャットダウン時にスレッドを正しくクリーンアップしないサードパーティのライブラリを処理する場合の回避策は何ですか?

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

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

最悪の場合、スレッドは非デーモンスレッドです。これらは実際にはJavaプロセスの終了を停止します。ただし、デーモンスレッドであっても、スレッドの続行を許可することはおそらく悪い習慣です。(例に戻ると)サーブレットコンテナが他のコードに埋め込まれている場合、他のコードはスレッドを動かしたまま実行し続ける可能性があり、問題が発生する可能性があります。

これらのスレッドを停止するためのプログラム的な方法はありません。では、何ができるでしょうか。

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

4

1 に答える 1

5

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

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

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

  • スレッドをクリーンにシャットダウンする必要がない場合は、System.exit()を呼び出してJVMのプラグをプルします。

  • 損傷の可能性を回避するためにスレッドをクリーンにシャットダウンする必要がある場合は、ライブラリを使用しないでください...または自分で問題を修正してください。

于 2012-08-10T13:14:46.230 に答える