2011-01-22 15 views
2

私は、Java main()、サーブレットコンテナ内、または依存関係注入を介して理論的に異なる環境で使用できるJavaクライアントを作成しています。実行終了時に自動的にシャットダウンするスレッドプールを実装する方法は?

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

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

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

+0

[可能なJavaプロセスの調査はどこから始めることができますか?](http://stackoverflow.com/questions/3236427/where-do-i-start-investigating-my-java-process - それは終わりの終わり) – finnw

答えて

5

前述のようにフックを追加することはできますが、スレッドプールにはまだアクティブスレッドが残っている可能性があります。

個々のスレッドを「デーモン」(Thread.setDaemonメソッド経由)としてマークすると、デーモンスレッドだけが残っているとJVMが有効にならないと思います。 JavaDocのから

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

プライマリ非デーモンスレッドが終了した場合、JVMは「ハングアップ」しませんので、他のスレッドの実行中の、これは明示的に終了命令を送信することなく、シャットダウンフックをトリガーさまざまなスレッド。

0

コードのユーザーがシャットダウンするスレッドプールが存在しないことが問題である場合は、おそらく解決策はその問題を認識させることです。関連するクラスのファクトリメソッドまたはコンストラクタでは、引数としてExecutorServiceを使用する必要があります。したがって、呼び出し元はそのライフサイクルを担当します。つまり、政策を上向きにするために統制注入を使用する。

関連する問題