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。由于我的初始延迟为零,并且在我的 Timer 设置后构造函数中发生了更多的事情,我怎么知道在对象初始化完成之前不会发生我的计时器的第一次调用?或者可能是这种情况(这当然不好)?

现在我的解决方案是我的计时器设置构造函数的最后一步,但这似乎充其量是不确定的。关于这个问题有什么智慧吗?

4

4 回答 4

2

如果您真的想确保MyClass在计时器启动之前完全初始化,您可以分两步进行初始化和计时器启动:

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来启动计时器。

当您可以构建对象然后立即开始计时时,在这里解决比赛问题似乎有点过头了。如果您有一个工厂来创建对象,这可能是构建过程的一部分。

于 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 回答
0
 Do this instead: Call the method  in the class you are using the MyClass object. 


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

   public class usingClass{
          public static void main(String args[]){
               MyClass mc=new MyClass();
               mc.startTimer();
          }

   }
于 2013-06-08T14:42:14.867 回答