Java静态计时器能否处理调用cancel()的多个TimerTask?
所以我运行一个Java服务器,在一个类中我有一个静态计时器。然后我有另一个类,它在程序的整个生命周期中创建和销毁了许多实例,每个实例都有自己的TimerTask(使用静态计时器)。当实例被销毁时,它会调用TimerTask上的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.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也解决了我的问题,谢谢!