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

dww*_*n66 2 java syntax

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我不明白括号和括号是如何工作的.乍一看,鉴于scheduleAtFixedRate(TimerTask task, long delay, long period)我的用法,我可以看到delayperiod参数,但不是第一个参数之前的开放式.

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

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

我只是想在我开始改变之前澄清我的理解.

Joh*_*ica 8

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

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

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

timer.scheduleAtFixedRate(task, delay, period);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

TimerTask task = new MyTimerTask();
timer.scheduleAtFixedRate(task, delay, period);
Run Code Online (Sandbox Code Playgroud)