gpt4 book ai didi

java - Java 静态 Timer 可以处理多个调用 cancel() 的 TimerTasks 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:03 25 4
gpt4 key购买 nike

所以我正在运行一个 Java 服务器,并且在一个类中我有一个静态计时器。然后我有另一个类,它在程序的整个生命周期中创建和销毁了许多实例,每个实例都有自己的 TimerTask(使用静态 Timer)。当实例被销毁时,它会调用 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() Timer是“死的”,你不能用它做任何其他事情。

来自API :

Once a timer has been terminated, its execution thread terminates gracefully, and no more tasks may be scheduled on it.

您有几个选择:

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

关于java - Java 静态 Timer 可以处理多个调用 cancel() 的 TimerTasks 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3445225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com