2

私は、理論的には別の環境で使用できるJavaクライアントを作成しています。Javamain()、サーブレットコンテナー、または依存性注入を介して。

クライアントは、内部接続スレッドプールを実装します。

このアプローチの問題は、内部スレッドプールが実装されていることに気付いていないクライアントのユーザーが、シャットダウン時にアプリケーションが「ハング」するのを目にすることです。私のユーザーは、shutdown()メッセージをライブラリに送信することを知っている必要があります。

一方では、接続用のスレッドプールを開始できるようにする他の代替アプローチを採用できるかどうか疑問に思っています。一方、JVMがダウンしていることを示すイベント、おそらくJVMイベントをキャッチします。これにより、shutdown()実装を呼び出すことができます。

4

3 に答える 3

5

前に提案したようにフックを追加することはできますが、まだ発生する可能性が高い問題は、スレッドプールにまだアクティブなスレッドがあることです。

個々のスレッドを「デーモン」としてマークすると (Thread.setDaemon メソッドを介して)、デーモン スレッドだけが残っていると JVM は存続しないと思います。

JavaDoc から:

このスレッドをデーモン スレッドまたはユーザー スレッドとしてマークします。実行中のスレッドがすべてデーモン スレッドのみの場合、Java 仮想マシンは終了します。

これを使用すると、デーモン以外のプライマリ スレッドが終了しても、他のスレッドが実行されているために JVM が「ハングアップ」することはありません。これにより、さまざまなスレッドに終了命令を明示的に送信しなくても、シャットダウン フックがトリガーされます。

于 2011-01-22T18:50:35.730 に答える
2

Runtime.getRuntime().addShutdownHook()と思うものだろう。http://blog.yohanliyanage.com/2010/10/know-the-jvm-2-shutdown-hooks/には適切な説明があります。それは役に立ちますか?

于 2011-01-22T17:55:22.803 に答える
0

コードのユーザーが、シャットダウンするスレッド プールがあることを認識していないことが問題である場合、おそらく解決策は、ユーザーにそのことを認識させることでしょうか? 関連するクラスのファクトリ メソッドまたはコンストラクターでは、ExecutorServiceto を引数として使用するため、呼び出し元がそのライフサイクルに責任を負います。つまり、依存性注入を使用してポリシーを上方にプッシュします。

于 2013-06-15T16:56:07.693 に答える