ライブラリがシャットダウンされたときにスレッドを正しくクリーンアップしないサードパーティのライブラリを扱う際の回避策はありますか?スレッドを停止しない悪い振る舞いのライブラリを処理する方法
多くのライブラリは、そこに含まれるコードに対して、明示的または暗黙的にライフサイクルメソッドを公開しています。たとえば、Webアプリケーションフレームワークは、サーブレットコンテナ内のWebアプリケーションコンテキスト内に存在します。コンテキストが作成されると、さまざまな理由でフレームワークがいくつかのスレッドを開始することがあります。
サーブレットコンテナまたはWebアプリケーションコンテキストがシャットダウンされると、Webアプリケーションフレームワークはこれらのスレッドをすべて終了する必要があります。ライブラリによって作成されたExecutorServiceのいずれかをシャットダウンするか、またはこれらのスレッドを停止する他の手段を実行する必要があります。
最悪の場合、スレッドはnon-daemon threadsです。これらは、実際にJavaプロセスの終了を停止します。しかし、それらがデーモンスレッドであっても、スレッドを続行できるようにすることはおそらく悪い習慣です。 (例に戻って)サーブレットコンテナが他のコード内に埋め込まれていれば、他のコードは引き続き実行され、問題を引き起こす可能性があります。
これらのスレッドを停止するためのプログラム的な方法はないので、何ができるのですか?
このようなサードパーティライブラリを使用している場合、既存のスレッドを強制的にシャットダウンする方法は何ですか?
+1ライブラリを実行すると、プロセスを強制終了することによる影響を減らすことができます。 (JNI図書館も同様) –
ありがとう@Stephen。はい、ここで説明するように、すべてのスレッドとスレッドグループを取得できます。http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java System.exit()は、スレッドを作成していたライブラリがそのプロセスの「ファーストクラス」コードとみなされる場合にのみ機能します。ライブラリが*コードで単純に使用されているなら、それはいいことではありません。 –
@Peterはもちろんライブラリに依存しています...別のプロセスで実行すると通信が難しくなります。 –