vaz*_*zor 3 java multithreading timer task
所以我正在运行Java服务器,在一个类中我有一个静态Timer.然后我有另一个类,它在程序的整个生命周期中创建和销毁了许多实例,每个实例都有自己的TimerTask(使用静态Timer).当一个实例被销毁时,它会在TimerTask上调用cancel().
问题是,我不确定这是不是很好的设计,而且在实例创建和调度TimerTask时我也会遇到错误:
java.lang.IllegalStateException: Timer already cancelled.
Run Code Online (Sandbox Code Playgroud)
这是一些显示我的意思的代码.
/**
* 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();
}
Run Code Online (Sandbox Code Playgroud)
错误是因为当你打电话cancel()给Timer'死'时你不能用它做任何其他事情.
来自API:
一旦计时器终止,其执行线程将正常终止,并且不再可以在其上安排任何任务.
你有几个选择:
Timer,而是Timer在每个对象中保存一个单独的实例.这样当对象被破坏时,你也可以在Timer不影响其他对象的情况下销毁对象TimerTask.这将意味着每个对象一个计时器线程.Timer但也保留在内存中(例如,在一个ArrayList<TimerTask>)中的所有任务的列表.然后,当一个对象被销毁时,您可以Timer使用内存中的任务列表(减去与您要销毁的对象相对应的一个)重新创建静态对象.这样做的结果是剩下的TimerTasks 的执行可能需要一些finessing(特别是如果你不希望它们全部'束缚').Timer喜欢的类以允许删除TimerTasks.(有人可能已经这样做了,我不知道)| 归档时间: |
|
| 查看次数: |
7551 次 |
| 最近记录: |