当前位置: 首页 > 面试题库 >

Java计时器

柴霖
2023-03-14
问题内容

我正在尝试使用计时器来安排应用程序中的重复事件。但是,我希望能够实时调整事件的触发时间(根据用户输入)。

例如:

public class HelperTimer extends TimerTask
{
    private Timer timer;
    //Default of 15 second between updates
    private int secondsToDelay = 15;

    public void setPeriod(int seconds)
    {
        this.secondsToDelay = seconds;
        long delay = 1000; // 1 second
        long period = 1000*secondsToDelay; // seconds
        if (timer != null) 
        {
            timer.cancel();
        }
        System.out.println(timer);
        timer = new Timer();
        System.out.println(timer);
        timer.schedule(this, delay, period);
    }
    public int getPeriod()
    {
        return this.secondsToDelay;
    }
}

然后,我启动此类的新实例并调用其set
period函数。但是,当我这样做时,我得到了一个非法状态异常。您可以看到System.out.println(timer);。在那儿,因为我正在检查,并且足够肯定,它们是两个不同的计时器……所以,当我尝试在全新的Timer实例上运行计划调用时,为什么会得到IllegalStateException!

java.util.Timer@c55e36
java.util.Timer@9664a1
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Task already scheduled or cancelled
    at java.util.Timer.sched(Unknown Source)
    at java.util.Timer.schedule(Unknown Source)
    at HelperTimer.setPeriod(HelperTimer.java:38)

问题答案:

您不能像在此处那样重复使用TimerTask。

计时器的相关部分:

private void sched(TimerTask task, long time, long period) {
    if (time < 0)
        throw new IllegalArgumentException("Illegal execution time.");

    synchronized(queue) {
        if (!thread.newTasksMayBeScheduled)
            throw new IllegalStateException("Timer already cancelled.");

        synchronized(task.lock) {
            //Right here's your problem.
            //  state is package-private, declared in TimerTask
            if (task.state != TimerTask.VIRGIN)
                throw new IllegalStateException(
                    "Task already scheduled or cancelled");
            task.nextExecutionTime = time;
            task.period = period;
            task.state = TimerTask.SCHEDULED;
        }

        queue.add(task);
        if (queue.getMin() == task)
            queue.notify();
    }
}

您需要重构代码,以便创建新的TimerTask,而不是重复使用它。



 类似资料:
  • 问题内容: 我正在尝试创建一个Timer / TimerTask,它将在每个月的同一天运行。我不能安排重复计时器,因为一个月的时间不会总是相同的。 所以,这是我的解决方案: 我想我会遇到的问题是,因为第一个TimerTask创建了第二个Timer,第一个Timer是否会保留,因为它创建了第二个Timer?代码在第一个Timer上完成之后,垃圾回收会处理该线程和对象吗?随着时间的流逝,我不想建立一堆

  • 问题内容: 我已经用Java创建了一个游戏,现在我只需要添加一个允许用户在60岁以下玩的计时器。我已经在互联网上进行搜索,找到了swing和util软件包的计时器。您能给我一种方法在我的游戏中使用它吗? 问题答案: 如果您想进行交互,可以使用和类: 因此,现在您有了一个计时器,可以触发另一个类的调用。现在,您可以安排它:

  • 问题内容: 因此,我在Google上搜索了几分钟如何使用计时器,并在此处找到了一些有用的线程。但是,当我想使用建议的代码时,Eclipse总是向我显示错误。 这是我现在要使用的代码。Eclipse在最后一行下划线,并在它们建议“删除参数以匹配’Timer()’”时加下划线。此外,它强调了start()并希望将其强制转换。:S 有人可以帮我吗?我已经安装了最新的Java版本^^ 多谢。 问题答案:

  • 问题内容: 我试图在我的EntryPoint中使用Java计时器: 但是当尝试编译时,我得到:没有源代码可用于type ;您忘了继承必需的模块吗? 我该如何解决此错误? 问题答案: 如果您使用的是Libgdx,则可以使用libgdx 基础结构 来计划将来运行的工作: 这样,您可以在独立于平台的代码中安排计时器。(特定于GWT的解决方案仅在项目的平台相关部分中起作用。)

  • 我想在Java做天文台;只是为了游戏。 我在Java API中找到了这个类,但我不知道如何使用它。 我尝试这个代码来创建天文台的对象,编译器说“我找不到简单的“天文台”。我想是因为我需要导入一个指定的librery来为天文台创建一个对象。 我的问题是创建类计时器的对象;我知道如何利用它来实现我的目标。 同样,我的问题是如何创建类天文台的对象,只是它。我需要指定的librery吗?是不是天文台类,我

  • 问题内容: 我经常将代码包装在System.nanoTime()对中以对其进行计时。就像是: 有没有好的时序库可以帮助解决此问题?本地代码也将被接受。 NB 探查器在这里不是解决方案,因为我想在单元测试中强制执行一些时间限制,所以我想以 编程 方式对方法进行计时。 问题答案: 忽略该答案,因为项目不再活动 我没有用过,但是最近遇到了perf4j。