【问题标题】:Creating a repeating timer reminder in Java在 Java 中创建重复计时器提醒
【发布时间】:2012-02-21 15:04:21
【问题描述】:

我想要一个每 2 秒更改一次自己的私有变量的类。我知道如果我做类似的事情

import java.util.Timer;
//...
Timer timer;
//...
timer.schedule(new ChangeSomething(), 2000);

它将在 2 秒后执行 ChangeSomething(),有没有办法告诉它每 2 秒执行一次操作,或者,如果我放入 ChangeSomething()

    timer.schedule(new ChangeSomething(), 2000);

会有用吗?

顺便说一句,timer.cancel() 究竟做了什么?

【问题讨论】:

    标签: java timer


    【解决方案1】:

    使用timer.scheduleAtFixedRate() 安排它每两秒重复一次:

    从指定时间开始安排指定任务以重复固定速率执行。随后的执行以大约固定的时间间隔进行,间隔指定的时间段。

    来自Timer.cancel()的javadoc:

    终止此计时器,丢弃任何当前计划的任务。不干扰当前正在执行的任务(如果存在)。一旦定时器被终止,它的执行线程就会优雅地终止,并且不能在其上安排更多的任务。

    编辑:

    与执行单个任务一次的Timer 的内部执行线程有关:

    在对 Timer 对象的最后一个实时引用消失并且所有未完成的任务都已完成执行后,计时器的任务执行线程将正常终止(并成为垃圾回收的对象)。但是,这可能需要任意长的时间才能发生。默认情况下,任务执行线程不作为守护线程运行,因此它能够防止应用程序终止。如果调用者想要快速终止定时器的任务执行线程,调用者应该调用定时器的取消方法。

    【讨论】:

    • 我对 timer.cancel() 的不理解是,在我完成一项仅安排一次的任务以确保它不会再次完成或不是吗?
    • Timer 的 Javadoc 表明这不是必需的,计时器的执行线程将终止。但是,它确实明确指出这可能需要任意长时间,cancel() 可以用来更快地终止它。 (将 Javadoc 中的相关段落粘贴到答案中)。
    【解决方案2】:

    在这里更准确地说:ChangeSomething() 是 ChangeSomething 类的构造函数。当您将 ChangeSomething 实例对象传递给计时器时,构造函数将立即执行,而不是在 2 秒后执行。就是对象的run()方法会在2秒后触发。

    要在 2 秒内重复执行该 run() 方法,请使用 schedule(TimerTask task, long delay, long period)

    【讨论】:

      【解决方案3】:

      您将需要调用 Timer 的不同调度方法,称为 scheduleAtFixedRate(...),它可以获取 3 个参数。前两个与您使用的 schedule 相同,而第三个参数表示连续任务执行之间的周期时间(以毫秒为单位)。

      import java.util.Timer;
      //...
      Timer timer;
      //...
      timer.scheduleAtFixedRate(new ChangeSomething(), 2000, 2000);
      

      您可以在此处查看此方法的 java pai 文档:http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask, java.util.Date, long)

      【讨论】:

        【解决方案4】:

        这是一个例子

        import java.util.Date;
        import java.util.Timer;
        import java.util.TimerTask;
        
        public class Test extends TimerTask {
           private int age;
        
           public Test() {
               Timer timer = new Timer();
               timer.scheduleAtFixedRate(this, new Date(), 2000);
           }
        
           /**
            * Implements TimerTask's abstract run method.
            */
            public void run(){
              //toy implementation
              System.out.print("Changing Data ... before change age is "+age+" ");
              changeAge();
              System.out.println("after change age is "+age);
        
            }
        
        
           private void changeAge() {
              age = (int)Math.round(Math.random()*1000);
           }
        
          public static void main(String[] args) {
                  new Test();
          }
        

        }

        【讨论】:

        猜你喜欢
        • 2014-06-20
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多