Java静态TimerTask关闭

标签 java timer application-shutdown

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

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

}

最佳答案

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

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

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

关于Java静态TimerTask关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10343727/

相关文章:

cocoa - 如何正确退出应用程序,调用 exit(0)?

java - Android/Java抽象类继承问题

java - Android:显示带有时间延迟的数组元素?

java - System.out.println() 被跳过

Java Timer 类说 "Timer tasks should complete quickly",我们如何快速定义?

java - 处理 P5 - millis() 的计时器问题

java - 如果在 Raspbian 中运行,请停止 Java 进程

visual-studio-2010 - 当调试器关闭时如何捕获 Qt 应用程序的退出?

java - 使用 Twitter4j API 获取 friend 的时间线

java - Apache Axis2 1.5.1 和 NTLM 身份验证