Java - Thread.sleep в основном методе

Я просматриваю код Java, который, по сути, представляет собой повторяющийся процесс, который перемещает / читает / анализирует некоторые файлы на регулярной основе и выводит данные в базу данных.Повторяющаяся часть выполняется (примерно) следующим образом:

public class CollectorMain {
    public static boolean signalRecieved = false;
    public static void main(String[] args) {
         Runtime.getRuntime().addShutdownHook(new Thread() {
              public void run() {  
              shutdown(); 
         }});
         while(!signalRecieved) {
              Collector.execute();
              try {
                  Thread.sleep(60 * 1000);
              } catch (InterruptedException e) {
                  break;
              }
         }
         // some shutdown logic
    }
    public static void shutdown() {
        signalReceived = true;
    }
}

public class Collector() {
    public static void execute() {
        // Move files from the queue dir to temp location
        // Read, parse files and insert records into database. 
        // Then delete the processed files
    }
}

Я рекомендовал провести рефакторинг кода, чтобы

  1. Создать экземпляр Collector и преобразовать статический метод execute () в метод экземпляра
  2. Чтобы использовать Runnable или TimerTask для обработки вызовов

Мой аргумент заключался в том, что использование Thread.wait из основного метода и объединение его со статическим доступом не является хорошим способом обработки повторяемого процесса, особенно при выполнении файлового ввода-вывода. На что автор ответил (цитируя)

В описании Runnable говорится, что «должен быть реализован любым классом. чьи экземпляры предназначены для выполнения потоком ". Фактически, я я намеренно избегаю потоков в этой программе из соображений стоимости vrs. требования к производительности.

Вот еще одна цитата из того же обсуждения, которая, надеюсь, поможет прояснить позицию автора.

Технически, Java не выполняется вообще, она интерпретируется JVM который затем выполняет машинные инструкции, чтобы имитировать, что Java код выполняется. Так что на самом деле JVM выполняется на поток или несколько потоков.

Но меня как автора кода Java не волнует. Если я не создаю «темы» в Java, тогда задача JVM - выглядеть так, как будто нет потоки - даже если JVM использует потоки «под прикрытием».

Пауза Java не выполняется, она моделируется последовательностью машин инструкции, которые могут или не могут вызывать ОС "ждать". (Вероятно, потому что JVM не хочет вращаться, сжигая циклы процессора, но это выбор реализации JVM).

Итак, у меня 2 вопроса:

  1. Ставит Thread.подождать в главном методе законный, безопасный и рекомендуемый способ выполнения повторяющейся задачи в этом случае? А если нет, то почему бы и нет, поскольку существует только один (основной) поток выполнения?
  2. Каковы проблемы использования статических методов в этом контексте (если они есть)?

Я буду рад предоставить дополнительную информацию, если вы есть другие вопросы.

7
задан Bostone 28 December 2011 в 01:06
поделиться