我有一个静态的,定期的,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?
}
答案 0 :(得分:1)
这一切都取决于你的应用程序实际上做了什么,但一般会有某种事件表明应用程序正在关闭。例如,如果它是一个GUI应用程序,那么这可能是“用户点击退出按钮”事件。或者它是一个基于servlet API的webapp,它将是一个由ServletContextListener触发的事件。
您应该为此事件添加一个侦听器,该侦听器会在您的foo对象上调用某种关闭方法。在这种关闭方法中,foo应该负责清理其资源,包括停止计时器。
作为最后的手段,您可能需要调查JVM shutdown hooks