我有一个静态的、周期性的java定时器/定时器任务,当应用程序关闭时,我想关闭它。我不希望应用程序挂起,因为一些线程仍在运行(就像eclipse中的调试模式一样,一些环境可能会杀死它)。我将其设置为静态的原因是我计划在包含类的所有实例中与Timer共享一些(非常简单,可能只是一个计数器)的内存,所以我觉得类的作用域是合适的。
我的问题是如何最好地关闭计时器?现在是使用finalize的合适时机吗?这个计时器看起来足够友好,让一个不确定的调用来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?
}发布于 2012-04-27 09:56:31
这完全取决于你的应用程序实际做了什么,但通常会有某种类型的事件来通知应用程序正在关闭。例如,如果它是一个GUI应用程序,那么这可能是“用户单击了退出按钮”事件。或者它是一个基于servlet API的webapp,它将是一个由ServletContextListener触发的事件。
您应该为该事件添加一个侦听器,该侦听器调用foo对象上的某种shutdown方法。在这个shutdown方法中,foo应该负责清理它的资源,包括停止计时器。
作为最后的手段,您可能希望研究一下JVM shutdown hooks
https://stackoverflow.com/questions/10343727
复制相似问题