Заставьте Java-программу спать без потоков - PullRequest
12 голосов
/ 25 февраля 2012

У меня есть Java-программа, которая выполняет некоторые вычисления и затем загружает результаты в базу данных MYSQL (размещенную на другом компьютере в той же сети). Иногда я сталкиваюсь с проблемой, что программа выполняет вычисления быстрее, чем загружает результат. Поэтому он не может загрузить все результаты. Программа в настоящее время не является многопоточной.

Есть ли способ заставить программу работать в спящем режиме на несколько миллисекунд после того, как она выполнила вычисления, чтобы загрузка прошла правильно. (Как и на других языках функция сна или ожидания)

Я могу запустить программу, но это будет слишком много переписывать. Есть ли более простой способ?

Спасибо

Ответы [ 8 ]

11 голосов
/ 25 февраля 2012

Есть ли способ заставить программу спать в течение нескольких миллисекунд после того, как она выполнит вычисления, чтобы загрузка прошла правильно.(Как и в других языках режим сна или ожидания)

Thread.sleep(milliseconds) - это публичный статический метод, который будет работать и с однопоточными программами.Что-то вроде следующего является типичным шаблоном:

try {
    // to sleep 10 seconds
    Thread.sleep(10000);
} catch (InterruptedException e) {
    // recommended because catching InterruptedException clears interrupt flag
    Thread.currentThread().interrupt();
    // you probably want to quit if the thread is interrupted
    return;
}

Нет необходимости реализовывать Runnable или делать что-либо еще с вызовами потока.Вы можете просто позвонить в любое время, чтобы поставить паузу в некотором коде.

9 голосов
/ 25 февраля 2012

Вам не нужно перезаписывать или что-то подобное.Все, что вам нужно сделать, это позвонить:

Thread.Sleep(5000); // pause the app for 5 seconds

Каждое приложение также является потоком, в вашем случае также называется однопоточным приложением.Вы можете использовать многопоточный API, такой как Sleep, без какого-либо другого кода или рефакторинга.

Однако, большое предупреждение: Если вам нужно использовать Thread.Sleep для управления потоком управления, тогдавероятно, что-то пошло не так архитектурно.С вашей точки зрения, я обеспокоен тем, что в том, что вы описываете как однопоточное приложение, вы, похоже, выполняете одну операцию, опережая другую.Это не должно быть возможно, если вы не получаете асинхронные события из других мест.

Еще одно предупреждение: Sleep принимает параметр в миллисекундах, который обычно произвольный и просто означает «подождите немного».Проблема заключается в том, что сегодня «некоторое время» может быть в порядке, но завтра ваша машина будет находиться под большей нагрузкой, а «немного» больше не будет достаточно хорошим, ваш сон будет прерываться, и появится та же ошибка.Конечно, вы можете установить время на «долгое время», но тогда вы будете ждать «долгое время» для каждой транзакции ... Уловка 22.

3 голосов
/ 25 февраля 2012

Использование Thread.sleep():

try
{
    Thread.sleep(1000); // Sleep for one second
}
catch (InterruptedException e)
{
    Thread.currentThread().interrupt();
}

Это не вводит новый Thread в программу и не требует каких-либо других Thread связанных машин.

1 голос
/ 25 февраля 2012

Просто используйте: -

try
{
Thread.sleep(<time in ms>);
}
catch(InterruptedException ex}
{
}

Это сделает текущий поток (например, основной поток) спящим.

0 голосов
/ 25 февраля 2012

Вы можете использовать Thread.sleep(); после расчета без необходимости переписывать всю программу с потоками!

0 голосов
/ 25 февраля 2012

Ваша программа не Multi -поточная ... но она использует поток.Thread.Sleep все равно будет работать.

0 голосов
/ 25 февраля 2012

Каждое Java-приложение выполняется в потоке в JVM.Вызов статического метода Thread.sleep приведет к тому, что поток вашего приложения (тот, который работает) остановится

0 голосов
/ 25 февраля 2012

Статический метод sleep() в классе java.lang.Thread приостанавливает текущий поток - который может быть просто основным потоком - при вызове. Вам не нужно делать ничего особенного, чтобы использовать это.

...