方法应该在其生命周期中调用一次且仅调用一次

时间:2012-03-30 10:32:30

标签: java static classloader application-lifecycle

我有一个方法实际上是一个调度程序,它每隔一小时运行一个进程并每小时创建一个日志文件。
我想在应用程序生命周期中调用一次这个方法,所以我从静态块中调用它。
但我觉得这不起作用,因为文件有时是在一小时内生成的,有时是在早期生成的。我听说静止块只执行一次是不是真的? 如果是,我应该怎么做?

3 个答案:

答案 0 :(得分:2)

当类加载器加载类时,静态初始化程序块仅执行一次。它们执行的时间与应用程序逻辑紧密相关。更准确地说,不同的类加载器可能会加载您的类,因此理论上静态块可以执行多次。

出于调度目的,请尝试使用开箱即用的调度程序库,例如Quartz调度程序。 (http://quartz-scheduler.org)这可能在第一次看起来有些开销,但是这些库提供了最终可能需要的高级功能。举个简单的例子:如果你的程序在一小时内停止并重新启动怎么办?然后,该过程可能在这个特定的小时内运行两次。使用石英也可以处理这种情况。

答案 1 :(得分:1)

你也需要一个变量。

class ...

  private static hasRun = false;

  public static synchronize boolean runOnce ()
  {
     if (hasRun) return false;

     hasRun = true;
     // do something
     return true;
  }

当没有使用此类时,可能永远不会调用静态块。

有关于卸载类的讨论 Unloading classes in java?

当卸载类发生时,可能比多次加载可能发生多次静态初始化程序调用。但是,在这种情况下,我的解决方案将失败,因为在这种情况下,任何解决方案都必须失败。

我觉得这种情况非常罕见且不太可能。但也许你不得不控制环境

答案 2 :(得分:-1)

静态方法并不意味着它只运行一次。 static意味着它可以访问外部方法而无需实例化类的实例。

最好的解决方案。有一个静态变量,因此它可以与静态方法一起刷新,并在执行该方法后立即增加该静态变量。每次执行此方法时,请检查该变量,如果已经增加,则立即退出。