2012-04-27 49 views
0

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

我的问题是如何最好地关闭计时器?这是一个适当的时间来使用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? 

} 

回答

1

这一切都取决于你的应用程序实际上没有,但一般会有一些类型的事件发出信号,表明应用程序正在关闭。例如,如果它是一个GUI应用程序,那么也许这将是“用户点击退出按钮”事件。或者它是基于servlet API的web应用程序,它将成为由ServletContextListener触发的事件。

你应该为这个事件添加一个监听器,这个监听器在你的foo对象上调用某种关闭方法。在这种关闭方法中,foo应该清理其资源,包括停止定时器。

作为最后的手段,您可能需要调查JVM shutdown hooks

+0

良好的答案(+1)。 – 2012-04-27 02:32:45