0

静的で定期的なJavaタイマー/タイマータスクがあり、アプリがシャットダウンしたときにシャットダウンしたいと思います。一部のスレッドがまだ実行されているため、アプリがハングしたくありません(Eclipseのデバッグモードで発生するように、一部の環境ではとにかく問題が発生する可能性があります)。私が静的にしている理由は、Timerを使用して、含まれているすべてのクラスのインスタンスにいくつかの(非常に単純な、おそらく単なるカウンター)共有メモリを使用することを計画しているため、クラススコープが適切であると感じています。

私の質問は、タイマーのシャットダウンをどのように行うのが最善かということです。これはファイナライズを使用するのに適切な時期ですか?このタイマーは十分に良性のように思われるので、ファイナライズするための非決定的な呼び出しが機能する可能性がありますか?クラスのインスタンスがもう存在しないことを確認するために、おそらく何らかのインスタンスカウントを行う必要がありますか?静的タイマーのシャットダウンを管理する方法に関する提案を歓迎します。

擬似コード:

class foo {

private static Timer someTimer = null;

public foo() {
  if(someTimer == null) {
     someTimer = new Timer(new TimerTask(...));
  }

}

//how should I shut this thing down?
protected void finalize() throws Throwable {

}

//or is better to have shutdown() called explicitly?

}
4

1 に答える 1

1

それはすべてアプリが実際に何をするかに依存しますが、一般的にはアプリがシャットダウンされていることを知らせる何らかのイベントが発生します。たとえば、GUIアプリの場合、これは「ユーザーが[終了]ボタンをクリックした」イベントである可能性があります。または、サーブレットAPIに基づくWebアプリであり、ServletContextListenerによって起動されるイベントになります。

このイベントのリスナーを追加する必要があります。このリスナーは、fooオブジェクトに対してある種のシャットダウンメソッドを呼び出します。このシャットダウンメソッド内では、fooはタイマーの停止を含め、リソースのクリーンアップを処理する必要があります。

最後の手段として、 JVMシャットダウンフックを調査することをお勧めします

于 2012-04-27T01:56:30.970 に答える