3

私はコードを書いていて、ふと思いつきました。Timer オブジェクトを作成し、 を介して繰り返しタスクをスケジュールしていますtimer.scheduleAtFixedRate(...)

public class MyClass {
  ..
  public MyClass() {
    Timer timer = new Timer(true);
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            doStuffEachSecond();
        }
    }, (long)0, (long)1000);
    // more stuff
  }

さて、doStuffEachSecond()は のインスタンス メソッドMyClassです。私の初期遅延はzeroであり、Timer の設定後にコンストラクターでさらに多くの処理が行われるため、オブジェクトの初期化が完了する前にタイマーの最初の呼び出しが発生しないことをどのように知ることができますか? それとも、そうなる可能性がありますか (もちろん、これは良くありません)?

今のところ私の解決策は、タイマーのセットアップコンストラクターの最後のステップであることですが、それはせいぜい疑わしいようです。この問題に関する知恵はありますか?

4

4 に答える 4

2

タイマーが開始する前に完全に初期化されていることを本当に保証したい場合MyClassは、初期化とタイマーの開始を 2 つの手順で実行できます。

final MyClass myMlass = new MyClass();
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
      myclass.doStuffEachSecond();
  }
}, 0L, 1000L);

編集

それについて考えた後、上記を静的ファクトリメソッドに入れることが、断然最良の解決策になります。

public class MyClass {
  private MyClass() { /* do stuff */ }
  public static MyClass createNew() {
    MyClass myClass = new MyClass();
    myClass.startRunning();
  }   
  private void startRunning() {
    new Timer(true).scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            doStuffEachSecond();
        }   
    }, 0L, 1000L);
  }   
}

これはあなたが望むすべてを行います。新しいものを作成する唯一の方法MyClassは、ファクトリ メソッドを使用することです。新しいものが作成されるたびに、初期化にタイマーが開始されます。

于 2013-06-08T14:40:24.537 に答える
1

Java のスレッドに似たものを使用します。コンストラクターを用意startしてから、タイマーを開始するようなメソッドを呼び出します。

ここで競合の問題を解決することは、オブジェクトを構築してすぐにタイミングを開始できる場合、少しやり過ぎに思えます。オブジェクトを作成する Factory がある場合、これは構築プロセスの一部である可能性があります。

于 2013-06-08T14:37:25.487 に答える
1

オブジェクトの作成からスケジューリングを分離します。あなたはそれがにおいがするのは正しいです。

public class MyClass {

  ...

  public MyClass() {
    ...
  }

  public static void start(final MyClass mc) {
    Timer timer = new Timer(true);
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            mc.doStuffEachSecond();
        }
    }, (long)0, (long)1000);
  }

}
于 2013-06-08T14:44:45.793 に答える