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

Java静态计时器能否处理调用cancel()的多个TimerTask?,java,multithreading,timer,task,Java,Multithreading,Timer,Task,所以我运行一个Java服务器,在一个类中我有一个静态计时器。然后我有另一个类,它在程序的整个生命周期中创建和销毁了许多实例,每个实例都有自己的TimerTask(使用静态计时器)。当实例被销毁时,它会调用TimerTask上的cancel() 问题是,我不确定这是否是一个好的设计,而且我有时在实例创建和调度其TimerTask时也会出错: java.lang.IllegalStateException: Timer already cancelled. 这里有一些代码来说明我的意思

所以我运行一个Java服务器,在一个类中我有一个静态计时器。然后我有另一个类,它在程序的整个生命周期中创建和销毁了许多实例,每个实例都有自己的TimerTask(使用静态计时器)。当实例被销毁时,它会调用TimerTask上的cancel()

问题是,我不确定这是否是一个好的设计,而且我有时在实例创建和调度其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();
}

该错误是因为当您调用
cancel()
时,
计时器已“死机”,您无法对其执行任何其他操作

从:

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

您有几个选择:

  • 去掉静态的
    计时器
    ,而是在每个对象中保留一个单独的
    计时器实例。这样,当对象被销毁时,您也可以销毁
    计时器
    ,而不会影响其他
    计时器任务
    s。这意味着每个对象有一个计时器线程
  • 保持静态
    计时器
    ,但同时在内存中(例如在
    阵列列表
    中)保留其中所有任务的列表。然后,当一个对象被销毁时,您可以使用内存中的任务列表(减去与您销毁的对象对应的任务列表)重新创建静态
    计时器
    对象。这样做的结果是,剩余
    TimerTask
    s的执行可能需要一些微调(特别是如果您不希望它们都“聚集起来”)
  • 扩展或编写自己的类
    Timer
    ,以允许删除
    TimerTask
    s。(可能有人已经做了,我不知道)
  • 使用允许您删除任务的

  • 对选项的伟大建议!尽管要澄清:即使我在TimerTask上调用cancel(),而不是静态计时器本身,计时器也会终止?是的,我读错了。您应该能够毫无问题地取消TimerTask。如果您100%确定只调用TimerTask.cancel(),而不是Timer.cancel(),那么请看这里:ScheduledThreadPoolExecutor也解决了我的问题,谢谢!