Метод должен вызываться один раз и только один раз в своем жизненном цикле - PullRequest
2 голосов
/ 30 марта 2012

У меня есть метод, который на самом деле является планировщиком, который запускает процесс каждые один час и создает файл журнала каждый час.Я хочу вызвать этот метод один раз в жизненном цикле приложения, поэтому я вызываю его из статического блока.Но я чувствую, что это не работает, потому что файл иногда создается за один час, а иногда и рано.Я где-то слышал, что статический блок выполняется только один раз, не правда ли?Если да, то что мне делать?

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Статические блоки инициализатора выполняются только один раз, когда загрузчик классов загружает класс. Время их выполнения настолько привязано к логике вашего приложения. Чтобы быть более точным, разные загрузчики классов могут загружать ваш класс, так что статический блок может быть выполнен более одного раза теоретически.

Для целей планирования попробуйте использовать готовую библиотеку планировщика, например, планировщик Quartz. (http://quartz -scheduler.org ) В первый раз это может показаться немного сложным, однако эти библиотеки предлагают расширенные функции, которые в конечном итоге могут вам понадобиться. Простой пример: что если ваша программа будет остановлена ​​и перезапущена через час? Тогда процесс может быть запущен дважды в этот конкретный час. Используя кварц, вы можете справиться и с этой ситуацией.

1 голос
/ 30 марта 2012

Вам также нужна переменная.

class ...

  private static hasRun = false;

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

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

Статический блок никогда не может быть вызван, когда этот класс не используется.

Существует обсуждение разгрузки классов Выгрузка классов в Java?

Когда происходит выгрузка классов, возможно несколько загрузок, чем может произойти многократный вызов статического инициализатора.Тем не менее, в этом случае мое решение потерпит неудачу, так как в этом случае ЛЮБОЕ решение должно дать сбой.

Я чувствую, что это крайне необычно и маловероятно.Но, может быть, вам придется иметь дело, когда вы не контролируете окружающую среду

0 голосов
/ 30 марта 2012

Статический метод не означает, что он запускается только один раз. static означает, что к нему можно обращаться вне метода без создания экземпляра класса.

Лучшее решение с моей головы. Имейте статическую переменную, чтобы она могла обновляться вместе с вашим статическим методом, и увеличивайте эту статическую переменную, как только этот метод будет выполнен. Каждый раз, когда этот метод выполняется, проверяйте эту переменную и сразу выходите, если она уже была увеличена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...