0

我有一个静态的、周期性的、java Timer/TimerTask,我想在应用程序运行时关闭它。我不希望应用程序挂起,因为某些线程仍在运行(例如在 Eclipse 中调试模式下发生的情况,某些环境可能会杀死该东西)。我让它静态的原因是我计划在所有包含类的实例中使用 Timer 有一些(非常简单,可能只是一个计数器)共享内存,所以我觉得类范围是合适的。

我的问题是如何最好地关闭定时器?现在是使用 finalize 的合适时间吗?这个计时器似乎足够良性,以至于有一个不确定的调用来完成可能会起作用?可能需要做某种实例计数来验证那里不再有该类的任何实例?欢迎提出有关管理静态计时器关闭的方法的建议。

伪代码:

class foo {

private static Timer someTimer = null;

public foo() {
  if(someTimer == null) {
     someTimer = new Timer(new TimerTask(...));
  }

}

//how should I shut this thing down?
protected void finalize() throws Throwable {

}

//or is better to have shutdown() called explicitly?

}
4

1 回答 1

1

这一切都取决于您的应用程序实际执行的操作,但通常会有某种事件表明应用程序正在关闭。例如,如果它是一个 GUI 应用程序,那么这可能是“用户单击退出按钮”事件。或者它是一个基于 servlet API 的 webapp,它将是一个由 ServletContextListener 触发的事件。

您应该为此事件添加一个侦听器,该侦听器在您的 foo 对象上调用某种关闭方法。在此关闭方法中, foo 应该负责清理其资源,包括停止计时器。

作为最后的手段,您可能想要调查JVM 关闭挂钩

于 2012-04-27T01:56:30.970 回答