我需要帮助理解java中的Timer类的scheduleAtFixedRate方法

时间:2013-03-22 13:09:37

标签: java syntax

成为Pomodoro technique的粉丝我正在制作一个倒数计时器让我完成我的作业任务。然而,这个特殊的项目不是功课。 :)

Stack有很多关于在用户输入之前使用定时器来控制延迟的问题,但在独立定时器上却没有太多问题。我从朋友那里遇到过这段代码,并且已经在Java Documentation上学过这门课程。

public class Stopwatch {
    static int interval;
    static Timer timer;

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.print("Input seconds => : ");
        String secs = sc.nextLine();
        int delay = 1000;
        int period = 1000;
        timer = new Timer();
        interval = Integer.parseInt( secs );
        System.out.println(secs);
        timer.scheduleAtFixedRate(new TimerTask()
        {
            public void run()
            {
                System.out.println(setInterval());
            }
        }, delay, period);
    }
    private static final int setInterval()
    {
        if( interval== 1) timer.cancel();
        return --interval;
    }
}

有些语法对我来说并不清楚。考虑:

timer.scheduleAtFixedRate(new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}, delay, period);

我不明白括号和括号是如何工作的。乍一看,考虑到scheduleAtFixedRate(TimerTask task, long delay, long period)的使用情况,我可以看到delayperiod参数,但不能看到第一个参数之前的开放式参数。

我的第一个参数实际上是整个代码块吗?我希望整个区块被圆括号包围......但事实并非如此。这是java中的常见语法吗?我以前从未碰过它。

新的TimerTask() {      public void run()      {           的System.out.println(setInterval的());      } }

我只是想澄清一下,在我开始改变之前我理解它。

3 个答案:

答案 0 :(得分:8)

timer.scheduleAtFixedRate(new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}, delay, period);

该代码等同于此重构,其中new TimerTask被分配给局部变量。

TimerTask task = new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
};

timer.scheduleAtFixedRate(task, delay, period);

当然奇怪的部分刚刚向上移动了一下。这个new TimerTask的东西究竟是什么?

Java具有定义anonymous inner classes的特殊语法。匿名类是语法上的便利。您可以在使用时定义它及其TimerTask方法,而不是在其他地方定义run()的子类。

上面的代码等同于以下代码,匿名TimerTask子类变为显式命名子类。

class MyTimerTask extends TimerTask
{
     public void run()
     {
          System.out.println(setInterval());
     }
}

TimerTask task = new MyTimerTask();
timer.scheduleAtFixedRate(task, delay, period);

答案 1 :(得分:2)

你是对的,第一个参数是整个代码块:

new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}

这些声明称为匿名类,在the Java Tutorials中有更详细的解释。

答案 2 :(得分:1)

这是anonymous inner class。你需要学习内部课程才能理解这个。通常,当您不需要在代码中的其他位置使用类时,将使用此类。你不能在其他地方使用它只是因为你没有引用指向它。 您也可以按如下方式替换上述代码:

class MyTimerTask extends TimerTask {

        @Override
        public void run() {
            // Timer task code goes here.
             System.out.println(setInterval());
        }

    }
    MyTimerTask timerTask = new MyTimerTask();
    timer.scheduleAtFixedRate(timerTask, delay, period);