2012-03-28 11 views
2

オブジェクト "A"があり、そのコンストラクタで何らかのプロセスを開始するとします。オブジェクトが解放されると(クリーンアップメソッドを呼び出す必要があります(ヌルに設定されているか、そのライフスコープから外れています)。Java、オブジェクト破壊のプロセスを殺す方法

問題は、javaにはデストラクタがなく、オブジェクトがnullに設定されたかスコープ外に出た直後に、いわゆる「finalize」メソッドが実行されることが保証されていないことです。 GCが「その時が来た」とみなしたときのみ。

また、コードがJava EEサーバー上で実行されるため、シャットダウンフックを使用することはできません。すぐに実行されて終了する単純なJava SEアプリケーションではありません。そのような状況で何ができるでしょうか?

+0

あなたが達成しようとしていることの例を挙げるならば、私たちは、あなたの問題に対する解決法または別のアプローチを考え出すのを手伝うことができます。 – Marthin

答えて

2

Java EEコンテナに独自のスレッドを作成することは避けてください。これらのスレッドは、推奨されなくなり、仮想マシン/ Java EEコンテナを破壊するものではないため、 http://www.roseindia.net/servlets/ServletContextListener-example.shtmlhttp://docs.oracle.com/cd/E13222_01/wls/docs92/commonj/commonj.html

あなたがのServletContextListenerを使用してJava EEアプリケーションの起動とシャットダウンを制御することができます。

は、Java EEコンテナの背景労働者を作成することを可能にするのCommonJ JSR 237を見てみましょう。

1

Javaを使用することはできません。

finalizeは、GCがオブジェクトを削除したいときはいつでも呼び出されますが、プログラムが終了すると呼び出されます(Java EEアプリケーションでは起こらない)。

あなた自身で行うことが唯一の方法です。たとえば、ObjectPoolを使用すると、オブジェクトAのすべてのインスタンスがリストに格納されます(必要に応じてタイムスタンプが追加されます)。 (例えば、wget & cronを使用して特別なURLをトリガとして)時間がたつと、このリストを繰り返し処理して、もはや不要なオブジェクトを破棄するだけです。

これは1つの(実際には単純な)方法です。

関連する問題