Как сделать задержку в ходе выполнения цикла?
Необходимо сделать цикл, в котором происходит выполнения действия -> задержка (допустим секунда) -> опять действие. Мои попытки приводят к тому, что действие выполняется, только все задержки «суммируются» и используются одновременно, что приводит к тому, что результат выводиться только к концу цикла.
public void Add(View v) < Run(); >public void Run() < while(a!=5)< a++; String b = String.valueOf(a); myList.add(b); name=myList.toArray(new String[myList.size()]); RV.setAdapter(new Adapter(name)); try < Thread.sleep(100); >catch (InterruptedException e) <> > >
Прошу помочь если не кодом, то советом/ссылкой на нечто подобное.
Отслеживать
1,150 7 7 серебряных знаков 14 14 бронзовых знаков
задан 18 мар 2018 в 17:33
57 1 1 золотой знак 1 1 серебряный знак 6 6 бронзовых знаков
А где у вас там выводится резултат?
19 мар 2018 в 10:32
Возможно кто-то еще меняет переменную a (так как она, судя по всему глобальная).
19 мар 2018 в 14:15
опишите детально проблему
7 янв 2019 в 19:10
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В чем проблема? Ваш вариант вполне подходит. Можно немного красивее:
for(int i = 0; i < 3; i++) < // Ваш код try < Thread.sleep(1000) >catch(InterruptedException ex) <> >
Все происходит как Вы и хотите: выполняется Ваш код -> задержка (1 сек) -> опять выполняется Ваш код . И так 3 раза.
Как сделать задержку в java
Задержать выполнение программы мы можем с помощью метода sleep из java.util.concurrent.TimeUnit или Thread :
import java.util.concurrent.TimeUnit; public class App public static void main(String[] args) throws InterruptedException TimeUnit.SECONDS.sleep(1); // задержка 1 секунда Thread.sleep(1000); // задержка 1000 миллисекунд > >
Метод thread sleep в Java – задержка по времени
Метод Thread.sleep() можно использовать для приостановки выполнения текущего потока на указанное время в миллисекундах. Значение аргумента в миллисекундах не может быть отрицательным, иначе оно выдает исключение IllegalArgumentException.
Существует еще один метод sleep(long millis, int nanos), который можно использовать для приостановки выполнения текущего потока на указанные миллисекунды и наносекунды. Допустимое значение nano second составляет от 0 до 999999.
InterruptedException возникает, если какой-либо поток прервал текущий поток. Прерванное состояние текущего потока очищается при возникновении этого исключения.
public static void sleep(long millis) throws InterruptedException
Как работает Thread Sleep?
Thread.sleep() взаимодействует с планировщиком потока, чтобы перевести текущий поток в состояние ожидания в течение указанного периода времени. По истечении времени, ожидания состояние потока изменяется на работоспособное состояние и ожидает ЦП для дальнейшего выполнения.
Таким образом, фактическое время ожидания текущего потока зависит от планировщика потока, который является частью операционной системы.
Пример thread sleep на Java
Вот простая программа на Java, в которой Thread.sleep() используется для задержки по времени основного потока на 2 секунды.
package com.journaldev.threads; public class ThreadSleep < public static void main(String[] args) throws InterruptedException < long start = System.currentTimeMillis(); Thread.sleep(2000); System.out.println("Sleep time in ms EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="eclipse">package com.tutorial; import java.lang.*; public class ThreadDemo implements Runnable < Thread t; public void run() < for (int i = 10; i < 13; i++) < System.out.println(Thread.currentThread().getName() + " " + i); try < // в течение 1000 миллисекунд Thread.sleep(1000); >catch (Exception e) < System.out.println(e); >> > public static void main(String[] args) throws Exception < Thread t = new Thread(new ThreadDemo()); // this will call run() function t.start(); Thread t2 = new Thread(new ThreadDemo()); // this will call run() function t2.start(); >>
Давайте скомпилируем и запустим программу, это даст следующий результат:
Thread-0 10
Thread-1 10
Thread-0 11
Thread-1 11
Thread-0 12
Thread-1 12
Средняя оценка 4.1 / 5. Количество голосов: 10
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
Паузы в программе

В работу программы на Java можно вставлять паузы. Обычно это не нужно, т.к. пользователи хотят, чтобы их программы работали как можно быстрее. И вряд ли кто-то из них обрадуется, если вы будете специально замедлять свой код.
Но у вас как у программиста может быть куча ситуаций, когда пауза в коде может быть полезной. Например, вы программируете игру и хотите, чтобы она делала какие-то действия раз в две секунды или несколько раз в секунду.
В общем, пауза вещь полезная, поэтому смотрим, как же добавить паузу в код. Это на самом деле очень просто:
Thread.sleep(время);
Где время — это длина паузы в миллисекундах ( 1/1000 часть секунды).
Исполнение такой команды приостановит вашу программу на время миллисекунд. Примеры:
Thread.sleep(2000);
Thread.sleep(500);
Thread.sleep(60 * 60 * 1000);
Вот как это можно использовать на практике. Допустим, мы пишем программу, которая бы запускала космический корабль. Так бы мог выглядеть ее код:
for (int i = 10; i > 0; i--) < System.out.println(i); Thread.sleep(1000); > System.out.println("Поехали");
2. Правильный расчет пауз
Длину паузы считать легко. Если вам нужно, чтобы программа что-то делала раз в секунду, поставьте паузу — 1000 мс. Если 2 раза в секунду, поставьте паузу 500 мс (1000/2).
Если нужно выполнять что-то 15 раз в секунду, паузу делаем длинной 66 мс (1000/15). Вроде бы все очень просто:
Длительность одного витка цикла = 1000 / количество раз в секунду
Но тут есть очень важный нюанс. Хотя многие команды выполняются очень быстро, они все же выполняются не мгновенно.
Смотрите. Допустим, у вас есть какое-то действие, выполнение которого занимает 100 мс. Вы хотите, чтобы оно выполнялось 5 раз в секунду. Какую длину паузы вам нужно выбрать? Точно не 200 мс.
Чтобы действие выполнялось 5 раз в секунду, нужно чтобы время выполнения действия + пауза равнялись 200 мс. Тогда оно действительно будет выполняться 5 раз в секунду. В нашем случае действие выполняется 100 мс, значит на паузу остается еще 100 мс
длина паузы = длительность одного витка цикла — время выполнения действия
То, что время выполнения действия гораздо выше нуля, хорошо понимают разработчики игр. Хотя и люди, играющие в игры, тоже.
Если у игры 20 FPS, это значит, что за одну секунду она успевает отрисовать на экране всего 20 кадров. 1000/20 — получаем 50 мс. Именно столько длится время отрисовки кадра игры .
3. Наносекунды
Современные компьютеры гораздо быстрее, чем во времена создания Java. Поэтому паузы в 1 миллисекунду может быть уже недостаточно.
Допустим мы осуществляем какое-то очень быстрое действие и хотим выполнять его 2000 раз в секунду. Как нам сделать паузу в пол миллисекунды?
А вот для этого есть еще одна модификация метода Thread.sleep() :
Thread.sleep(миллисекунды, наносекунды);
Данный метод усыпляет программу на указанное время миллисекунд и наносекунд.
Наносекунды — это 1 миллионная от миллисекунд. Поэтому пауза в полторы миллисекунды будет выглядеть так:
Thread.sleep(1, 500_000);
Ну а если вы хотите паузу в 1/10 миллисекунды, вам нужно будет написать так:
Thread.sleep(0, 100_000);
Возможно, прямо сейчас вы этот метод использовать в своих программах не будете. Но лучше знать, что он есть и не использовать, чем нуждаться в нем и не знать, что он есть.
4. Класс TimeUnit
Кстати, в Java есть еще один класс, который облегчит вашу жизнь, если вы таки решите сделать ваше приложение еще медленнее — это класс TimeUnit из пакета java.util.concurrent .
И, как вы помните, если пакет класса не java.lang , нужно или добавить строку import java.util.concurrent.TimeUnit; , или писать каждый раз в коде java.util.concurrent.TimeUnit
Этот класс делает то же самое, что и Thread.sleep() , просто удобнее:
TimeUnit.HOURS.sleep(15)
Этот код усыпит вашу программу на 15 часов. Также доступны минуты, секунды, дни. А еще — микросекунды (1/1000,000) и наносекунды (1/1000,000,000).
У класса TimeUnit есть такие свойства:
- наносекунды: NANOSECONDS
- микросекунды: MICROSECONDS
- миллисекунды: MILLISECONDS
- секунды: SECONDS
- минуты: MINUTES
- часы: HOURS
- дни: DAYS
Очень удобно работать с такими свойствами: не нужно задумываться о переводе, скажем, часов в миллисекунды. Такой код и писать, и читать гораздо приятнее.