代码之家  ›  专栏  ›  技术社区  ›  vazor

Java静态计时器能否处理多个调用cancel()的TimerTask?

  •  3
  • vazor  · 技术社区  · 15 年前

    问题是,我不确定这是否是一个好的设计,而且在实例创建和调度其TimerTask时有时也会出错:

         java.lang.IllegalStateException: Timer already cancelled.
    

    这里有一些代码来说明我的意思。

    /**
     * Starts scheduled tasks using TimerTask
     */
    private void initTasks()
    {
        // room heartbeat thread:  start immediately, run once every second
        roomHeartbeatTask = new RoomHeartbeatTask(this);
        RoomListExtension.roomHeartbeat.schedule(roomHeartbeatTask, 0, 1000);
        // add additional tasks here
    }
    
    /**
     * Cancels all tasks that have been started by this extension
     */
    private void cancelTasks()
    {
        roomHeartbeatTask.cancel();
    }
    
    1 回复  |  直到 15 年前
        1
  •  5
  •   Catchwa    15 年前

    错误是因为当你打电话的时候 cancel() Timer

    API :

    一旦计时器被终止,它的执行线程就会正常终止,并且不能在其上安排更多的任务。

    您有几个选择:

    1. 定时器 在每个对象中。这样,当对象被销毁时,也可以销毁 不影响对方 TimerTask s。这意味着每个对象有一个计时器线程。
    2. 保持静电 定时器 但也要记住(例如在 ArrayList<TimerTask> )其中所有任务的列表。然后,当一个对象被销毁时,您将重新创建静态 定时器 对象使用内存中的任务列表(减去与目标对象对应的任务列表)。这样做的后果是剩余的 s可能需要一些技巧(特别是如果你不想让他们都“聚在一起”的话)。
    3. 扩展或编写自己的 定时器 -类允许移除 s(可能已经有人这样做了,我不知道)
    4. 使用 ScheduledThreadPoolExecutor