Я просматриваю код Java, который по существу является повторяющимся процессом, который перемещает/читает/анализирует некоторые файлы на регулярной основе и выводит данные в базу данных. Повторяющаяся часть делается (грубо) следующим образом:Java - Thread.sleep в основном методе
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
}
}
Моя рекомендация реорганизовать код
- Создать экземпляр коллектора и реорганизовать статический метод Execute() к методу экземпляра
- Для используйте Runnable или TimerTask для обработки вызовов.
Мой аргумент заключался в том, что использование Thread.wait из основного метода и объединение его со статическим доступом не является хорошим способом o f обрабатывает повторяемый процесс, особенно делая файл IO. На что автор ответил (цитирую)
Описание Runnable говорит «должен быть реализован любым классом , экземпляры которого предназначены для исполнения на волоске». Фактически, I умышленно избегает потоков в этой программе по соображениям стоимости vrs.performance requirements.
Вот еще одна цитата из той же дискуссии, которые, надеемся, помогут прояснить позицию автора
Технически, Java не выполняется вообще, это интерпретируется JVM , который затем выполняет машинные команды, для имитации того, что выполняется код Java . Так что это действительно JVM, который выполняется в потоке или нескольких потоках.
Но, как писатель кода Java, мне все равно. Если я не создаю «потоки» в Java, то это будет работа JVM, как будто нет ни одного потоков, даже если JVM использует потоки «под обложками».
Пауза Java не выполняется, она имитируется последовательностью команд , которые могут или не могут вызывать «ожидание» ОС. (Вероятно, это , потому что JVM не захочет вращаться, сжигая циклы процессора, но это выбор реализации JVM).
Так что у меня 2 вопроса:
- ставит
Thread.wait
в основной метод законны, безопасным и целесообразным способом делать повторяемые задания в этом случае? А если нет, то почему нет, так как есть только один (основной) поток исполнения? - Каковы погрешности использования статических методов в этом контексте (если есть)?
Я буду рад предоставить дополнительную информацию, если у вас есть другие вопросы.
Не следует ли защищать 'signalRecieved' (например,' volatile'), так как он разделен между основным потоком и крюком отключения? – dacwe
Хорошая мысль, идет к идее «не использовать несколько потоков» – Bostone
Завершение крючков __are__ отдельных потоков. – toto2