Метод sleep
Метод sleep класса TimeUnit приостанавливает
выполнение текущего потока на заданное время. Первым
параметром метод принимает количество времени, вторым -
единицу измерения (наносекунды, микросекунды, миллисекунды,
секунды, минуты, часы или дни). В отличие от статического
метода Thread.sleep, где время всегда задается
в миллисекундах, здесь единица измерения выбирается
явно, что делает код более читаемым. Метод выбрасывает
исключение InterruptedException, если поток был
прерван во время ожидания.
Синтаксис
TimeUnit.UNIT.sleep(time)
Пример
Давайте приостановим поток на 2 секунды:
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
System.out.println("Start");
TimeUnit.SECONDS.sleep(2);
System.out.println("End");
}
}
Результат выполнения кода (с паузой 2 секунды между строками):
"Start"
"End"
Пример
Давайте приостановим поток на 500 миллисекунд:
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
long start = System.currentTimeMillis();
TimeUnit.MILLISECONDS.sleep(500);
long end = System.currentTimeMillis();
System.out.println(end - start >= 500);
}
}
Результат выполнения кода:
true
Пример
Давайте сравним работу с разными единицами измерения.
Метод toMillis переводит время в миллисекунды:
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args)
{
System.out.println(TimeUnit.SECONDS.toMillis(1));
System.out.println(TimeUnit.MINUTES.toMillis(1));
System.out.println(TimeUnit.HOURS.toMillis(1));
}
}
Результат выполнения кода:
1000
60000
3600000
Пример
Давайте обработаем исключение InterruptedException,
которое возникает при прерывании потока во время сна:
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args)
{
Thread thread = new Thread(() -> {
try
{
TimeUnit.SECONDS.sleep(10);
System.out.println("Finished");
}
catch (InterruptedException e)
{
System.out.println("Interrupted");
}
});
thread.start();
thread.interrupt();
}
}
Результат выполнения кода:
"Interrupted"