Как я могу сделать задержку в Java?
Я пытаюсь сделать что-то в Java, и мне нужно что-то подождать/задержать на некоторое количество секунд в цикле while.
while (true) {
if (i == 3) {
i = 0;
}
ceva[i].setSelected(true);
// I need to wait here
ceva[i].setSelected(false);
// I need to wait here
i++;
}
Я хочу построить пошаговый секвенсор, и я новичок в Java. Какие-либо предложения?
Ответы
Ответ 1
Если вы хотите сделать паузу, используйте java.util.concurrent.TimeUnit
:
TimeUnit.SECONDS.sleep(1);
Чтобы спать в течение одной секунды или
TimeUnit.MINUTES.sleep(1);
Чтобы спать на минутку.
Поскольку это цикл, это представляет собой неотъемлемую проблему - дрейф. Каждый раз, когда вы запускаете код, а затем спать, вы будете немного отставать от бега, скажем, каждую секунду. Если это проблема, не используйте sleep
.
Кроме того, sleep
не очень гибкий, когда дело доходит до контроля.
Для запуска задачи каждую секунду или за одну секунду я бы сильно рекомендовал ScheduledExecutorService
и либо scheduleAtFixedRate
или scheduleWithFixedDelay
.
Например, для запуска метода myTask
каждую секунду (Java 8):
public static void main(String[] args) {
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS);
}
private static void myTask() {
System.out.println("Running");
}
И в Java 7:
public static void main(String[] args) {
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
myTask();
}
}, 0, 1, TimeUnit.SECONDS);
}
private static void myTask() {
System.out.println("Running");
}
Ответ 2
Используйте Thread.sleep(1000)
;
1000
- это количество миллисекунд, которые программа приостановит.
try
{
Thread.sleep(1000);
}
catch(InterruptedException ex)
{
Thread.currentThread().interrupt();
}
Ответ 3
Вам нужно использовать Thread.sleep()
.
Более подробная информация здесь: http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html
Ответ 4
Используйте Thread.sleep(100);
, Единица времени - миллисекунды
Например:
public class SleepMessages {
public static void main(String args[])
throws InterruptedException {
String importantInfo[] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
for (int i = 0;
i < importantInfo.length;
i++) {
//Pause for 4 seconds
Thread.sleep(4000);
//Print a message
System.out.println(importantInfo[i]);
}
}
}
Ответ 5
Использование TimeUnit.SECONDS.sleep(1);
или Thread.sleep(1000);
Это приемлемый способ сделать это. В обоих случаях вам нужно поймать InterruptedException
который делает ваш код громоздким. Существует java-библиотека с открытым исходным кодом под названием MgntUtils (написанная мной), которая предоставляет утилиту, которая уже имеет дело с InterruptedException
внутри. Итак, ваш код будет содержать только одну строку:
TimeUtils.sleepFor(1, TimeUnit.SECONDS);
Смотрите Javadoc здесь. Вы можете получить доступ к библиотеке из Maven Central или из Github. Статью с описанием библиотеки можно найти здесь
Ответ 6
Я знаю, что это очень старая статья, но она может кому-то помочь: вы можете создать метод, поэтому всякий раз, когда вам нужно сделать паузу, вы можете ввести pause(1000)
или любое другое значение в миллисекундах:
public static void pause(int ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
System.err.format("IOException: %s%n", e);
}
}
Он вставляется чуть выше public static void main(String[] args)
внутри класса. Затем, чтобы вызвать метод, введите pause(ms)
но замените ms
на количество миллисекунд для паузы. Таким образом, вам не нужно вставлять весь оператор try-catch всякий раз, когда вы хотите сделать паузу.
Ответ 7
while (true) {
if (i == 3) {
i = 0;
}
ceva[i].setSelected(true);
try{Thread.sleep(time_in_milliseconds);}catch(InterruptedException ie){}
ceva[i].setSelected(false);
try{Thread.sleep(1000);}catch(InterruptedException ie){}
i++;
}
1 секунда - 1000 миллисекунд.
Ответ 8
используйте это:
public static void wait(int ms){
try
{
Thread.sleep(ms);
}
catch(InterruptedException ex)
{
Thread.currentThread().interrupt();
}
}
тогда вы можете вызывать этот метод в любом месте, например:
wait(1000);
Ответ 9
подождите несколько секунд, чтобы ваш компилятор использовал этот статический класс
TimeUnit.SECONDS.sleep(1);
это включает в java.util.concurrent.TimeUnit свободы