我需要帮助理解java中Timer类的scheduleAtFixedRate方法
作为一个家庭作业迷,我给自己做了一个倒计时器,让我完成家庭作业。然而,这个特殊的项目不是家庭作业 Stack在使用计时器控制用户输入前的延迟等方面有很多问题,但在独立计时器方面问题不多。我从一位朋友那里偶然发现了这段代码,并研究了Java文档类我需要帮助理解java中Timer类的scheduleAtFixedRate方法,java,syntax,Java,Syntax,作为一个家庭作业迷,我给自己做了一个倒计时器,让我完成家庭作业。然而,这个特殊的项目不是家庭作业 Stack在使用计时器控制用户输入前的延迟等方面有很多问题,但在独立计时器方面问题不多。我从一位朋友那里偶然发现了这段代码,并研究了Java文档类 public class Stopwatch { static int interval; static Timer timer; public static void main(String[] args) {
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任务,长延迟,长周期)
我可以看到delay
和period
参数,但不能看到第一个参数前面的打开参数
我的第一个参数实际上就是这整段代码吗?我希望整个街区都被括号包围……但事实并非如此。这是java中常见的语法吗?我以前从未见过它
新TimerTask()
{
公开募捐
{
System.out.println(setInterval());
}
}
我只是想澄清一下,在我开始胡闹改变之前,我理解它 没错,第一个参数是整个代码块:
new TimerTask()
{
public void run()
{
System.out.println(setInterval());
}
}
这些声明称为匿名类,将在中详细解释
该代码相当于此重构,其中新TimerTask
被分配给一个局部变量
TimerTask task = new TimerTask()
{
public void run()
{
System.out.println(setInterval());
}
};
timer.scheduleAtFixedRate(task, delay, period);
当然,奇怪的部分只是向上移动了一点。这到底是什么newtimertask
东西
Java有特殊的语法来定义。匿名类在语法上很方便。您不必在其他地方定义TimerTask
的子类,而可以在使用时定义它及其run()
方法
上面的代码相当于下面的代码,将匿名TimerTask
子类转换为显式命名子类
class MyTimerTask extends TimerTask
{
public void run()
{
System.out.println(setInterval());
}
}
TimerTask task = new MyTimerTask();
timer.scheduleAtFixedRate(task, delay, period);
这是一个好主意。你需要学习内部类来理解这一点。通常,当您不需要在代码中的其他位置使用该类时,就会使用此类类。您不能在其他地方使用它,因为您没有指向它的引用。
您还可以按如下方式替换上述代码:
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);
好极了还感谢他们的名字,这样我就知道该在教程中查找什么了。:)@威尔森66:不客气。不要忘记对有用的答案进行投票,如果您满意,请将最好的答案标记为已接受。
但是,这个项目不是家庭作业。:)代码>听起来像是有人试图让StackOverflow解决他们的家庭作业时会说的话。ಠ~ಠ
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);