我有一个方法,它实际上是一个调度程序,它每隔一小时运行一个进程并每小时创建一个日志文件。
我想在应用程序生命周期中调用一次这个方法,所以我从一个静态块中调用它。
但我觉得这不起作用,因为文件有时会在一小时内生成,有时会提前生成。我在某处听说静态块只执行一次,这不是真的吗?
如果是,我应该怎么做?
问问题
10335 次
3 回答
3
静态初始化块仅在类加载器加载类时执行一次。它们执行的时间与您的应用程序逻辑如此密切相关。更准确地说,不同的类加载器可能会加载您的类,因此静态块理论上可以执行多次。
出于调度目的,请尝试使用开箱即用的调度程序库,例如 Quartz 调度程序。( http://quartz-scheduler.org ) 第一次这可能看起来有点开销,但是这些库提供了您最终可能需要的高级功能。只是一个简单的例子:如果你的程序在一小时内停止并重新启动怎么办?然后该过程可能会在这个特定小时内运行两次。使用石英您也可以处理这种情况。
于 2012-03-30T10:38:54.593 回答
2
你也需要一个变量。
class ...
private static hasRun = false;
public static synchronize boolean runOnce ()
{
if (hasRun) return false;
hasRun = true;
// do something
return true;
}
当没有使用此类时,可能永远不会调用静态块。
有一个关于卸载类的讨论 在java中卸载类?
当卸载类发生时,可能会发生多次加载,而不是多次调用静态初始化程序。但是,在这种情况下,我的解决方案将失败,因为在这种情况下,任何解决方案都必须失败。
我觉得这非常罕见且不太可能。但是,当您无法控制环境时,也许您必须考虑
于 2012-03-30T10:38:33.703 回答
-1
静态方法并不意味着它只运行一次。static 意味着它可以在不实例化类实例的情况下访问外部方法。
我头脑中的最佳解决方案。有一个静态变量,以便它可以与您的静态方法一起刷新,并在该方法执行后立即增加该静态变量。每次执行此方法时,检查该变量并立即退出,如果它已经增加。
于 2012-03-30T10:36:40.250 回答