Проблемы с бесконечным циклом - PullRequest
2 голосов
/ 20 июня 2011

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

for(;;){
    result = loadData.checkChanges();
    if(result == true){
        //If changes found in the properties file then reSchedule tasks
        reSchedule();
    }
}

Если цикл работает до срока службы приложения на «сервере приложений» (один год или два года), возникнут ли у него какие-либо проблемы с производительностью или проблемы с JVM, или есть какие-либо другие проблемы?

Ответы [ 3 ]

3 голосов
/ 20 июня 2011

Если ваш метод checkChanges() не спит или не блокируется, код, который написан в данный момент, будет перегружать процессор, вызывая loadData.checkChanges(); так быстро, как только процессор сможет это сделать. В идеале вы должны сделать что-то вроде вызова loadData.wait(), а затем вызвать другой поток loadData.notify(), когда вы хотите выполнить проверку. Более простое и почти такое же хорошее решение - периодически спать в потоке, например:

for(;;){
    result = loadData.checkChanges();
    if(result == true){
        //If changes found in the properties file then reSchedule tasks
        reSchedule();
    }
    try {
        Thread.sleep(100);
    }
    catch (InterruptedException ignored) {}
}

Также, пожалуйста, не используйте for(;;). Вместо этого попробуйте while(true), это намного понятнее. Или, что еще лучше, попробуйте while(!stop), где stop - это логическая переменная, для которой устанавливается значение true, когда контекст вашего приложения разрушен (завершение работы сервера, отмена развертывания веб-приложения и т. Д.).

1 голос
/ 20 июня 2011

Как уже говорилось, процессор будет работать максимально. Но вы можете легко предотвратить это, подождав некоторое фиксированное время, например, 1 сек, в конце цикла:

try { Thread.sleep(1000); } catch (InterruptedException ex) {}
1 голос
/ 20 июня 2011

Это будет огромный процессор, поскольку он запускает бесконечный цикл без какого-либо опроса или механизма ожидания.Лучше использовать Java Executor API для такого рода работы: http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executor.html

...