Метод sleep
— Привет, Амиго! Билаабо сегодня расскажет тебе о самом интересном методе при работе с нитями – это метод sleep . Метод sleep объявлен как статический метод класса Thread , т.е. он не привязан ни к какому объекту. Цель этого метода, чтобы программа «заснула» на некоторое время. Вот как это работает:
public static void main(String[] args) < Thread.sleep(2000); >
Затем замрет на 2 секунды (2 000 миллисекунд)
Единственный параметр метода sleep – это время. Время задается в тысячных долях секунды (миллисекундах). Как только нить вызывает этот метод, она засыпает на указанное количество миллисекунд.
— А где это лучше всего использовать?
— Этот метод часто используется в дочерних нитях, когда нужно делать какое-то действие постоянно, но не слишком часто. Смотри пример:
public static void main(String[] args) < while (true) < Thread.sleep(500); System.out.println("Tik"); > >
Вот что программа делает в цикле:
а) поспать полсекунды
б) вывести на экран текст «Tik»
— Ух ты, теперь это уже интересно.
— Рад, что тебе понравилось, мой друг Амиго!
— А если я хочу, чтобы какое-то действие выполнялось 100 раз в секунду, что нужно делать?
— Если действие должно выполняться 100 раз в секунду, а в секунде 1000 миллисекунд, значит, действие должно выполняться один раз в 10 миллисекунд.
Если твое действие занимает 2 миллисекунды, то нужно добавить к нему паузу длинной 8 миллисекунд. Вместе они будут выполняться как раз за 10 миллисекунд. И за секунду – как раз 100 раз.
Если же твое действие выполняется почти мгновенно, то поставь паузу (sleep) длиной 10 миллисекунд. Тогда в секунду будет тоже около 100 раз.
Pausing Execution with Sleep
Thread.sleep causes the current thread to suspend execution for a specified period. This is an efficient means of making processor time available to the other threads of an application or other applications that might be running on a computer system. The sleep method can also be used for pacing, as shown in the example that follows, and waiting for another thread with duties that are understood to have time requirements, as with the SimpleThreads example in a later section.
Two overloaded versions of sleep are provided: one that specifies the sleep time to the millisecond and one that specifies the sleep time to the nanosecond. However, these sleep times are not guaranteed to be precise, because they are limited by the facilities provided by the underlying OS. Also, the sleep period can be terminated by interrupts, as we’ll see in a later section. In any case, you cannot assume that invoking sleep will suspend the thread for precisely the time period specified.
The SleepMessages example uses sleep to print messages at four-second intervals:
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]); >> >
Notice that main declares that it throws InterruptedException . This is an exception that sleep throws when another thread interrupts the current thread while sleep is active. Since this application has not defined another thread to cause the interrupt, it doesn’t bother to catch InterruptedException .
How to pause the code execution in Java
Sometimes you want to pause the execution of your Java code for a fixed number of milliseconds or seconds until another task is finished. There are multiple ways to achieve this.
The quickest way to stop the code execution in Java is to instruct the current thread to sleep for a certain amount of time. This is done by calling the Thread.sleep() static method:
try System.out.printf("Start Time: %s\n", LocalTime.now()); Thread.sleep(2 * 1000); // Wait for 2 seconds System.out.printf("End Time: %s\n", LocalTime.now()); > catch (InterruptedException e) e.printStackTrace(); >
The code above stops the execution of the current thread for 2 seconds (or 2,000 milliseconds) using the Thread.sleep() method. Also, notice the try. catch block to handle InterruptedException . It is used to catch the exception when another thread interrupts the sleeping thread. This exception handling is necessary for a multi-threaded environment where multiple threads are running in parallel to perform different tasks.
For better readability, you can also use the TimeUnit.SECONDS.sleep() method to pause a Java program for a specific number of seconds as shown below:
try System.out.printf("Start Time: %s\n", LocalTime.now()); TimeUnit.SECONDS.sleep(2); // Wait 2 seconds System.out.printf("End Time: %s\n", LocalTime.now()); > catch (InterruptedException e) e.printStackTrace(); >
Under the hood, the TimeUnit.SECONDS.sleep() method also calls the Thread.sleep() method. The only difference is readability that makes the code easier to understand for unclear durations. The TimeUnit is not just limited to seconds. It also provides methods for other time units such as nanoseconds, microseconds, milliseconds, minutes, hours, and days:
// Wait 500 nanoseconds TimeUnit.NANOSECONDS.sleep(500); // Wait 5000 microseconds TimeUnit.MICROSECONDS.sleep(5000); // Wait 500 milliseconds TimeUnit.MILLISECONDS.sleep(500); // Wait 5 minutes TimeUnit.MINUTES.sleep(5); // Wait 2 hours TimeUnit.HOURS.sleep(2); // Wait 1 day TimeUnit.DAYS.sleep(1);
The sleep times are inaccurate with Thread.sleep() when you use smaller time increments like nanoseconds, microseconds, or milliseconds. This is especially true when used inside a loop. For every iteration of the loop, the sleep time will drift slightly due to other code execution and become completely imprecise after some iterations. For more robust and precise code execution delays, you should use the ScheduledExecutorService interface instead. This interface can schedule commands to run after a given delay or at a fixed time interval. For example, to run the timer() method after a fixed delay, you use the schedule() method:
public class Runner public static void main(String[] args) ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); // Execute timer after 2 seconds service.schedule(Runner::timer, 2, TimeUnit.SECONDS); > public static void timer() System.out.println("Current time: " + LocalTime.now()); > >
Similarly, to call the method timer() every second, you should use the scheduleAtFixedRate() method as shown below:
public class Runner public static void main(String[] args) ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); // Execute timer every second service.scheduleAtFixedRate(Runner::timer, 0, 1, TimeUnit.SECONDS); > public static void timer() System.out.println("Current time: " + LocalTime.now()); > >
Current time: 08:48:11.350034 Current time: 08:48:12.335319 Current time: 08:48:13.337250 Current time: 08:48:14.334107 Current time: 08:48:15.338532 Current time: 08:48:16.336175 ...
You might also like.
Как сделать паузу в java
Паузу в выполнении программы можно задать с помощью метода sleep() :
import java.util.concurrent.TimeUnit; public class App public static void main(String[] args) throws InterruptedException Thread.sleep(1000); // пауза 1000 миллисекунд TimeUnit.SECONDS.sleep(1); // пауза 1 секунда > >
Здоровый sleep
— Привет, Амиго! Билаабо сегодня расскажет тебе о самом интересном методе при работе с нитями – это метод sleep . Метод sleep объявлен как статический метод класса Thread , т.е. он не привязан ни к какому объекту. Цель этого метода, чтобы программа «заснула» на некоторое время. Вот как это работает:
public static void main(String[] args) < Thread.sleep(2000); >
Затем замрет на 2 секунды (2 000 миллисекунд)
Единственный параметр метода sleep – это время. Время задается в тысячных долях секунды (миллисекундах). Как только нить вызывает этот метод, она засыпает на указанное количество миллисекунд.
— А где это лучше всего использовать?
— Этот метод часто используется в дочерних нитях, когда нужно делать какое-то действие постоянно, но не слишком часто. Смотри пример:
public static void main(String[] args) < while (true) < Thread.sleep(500); System.out.println("Tik"); > >
Вот что программа делает в цикле:
а) поспать полсекунды
б) вывести на экран текст «Tik»
— Ух ты, теперь это уже интересно.
— Рад, что тебе понравилось, мой друг Амиго!
— А если я хочу, чтобы какое-то действие выполнялась 100 раз в секунду, что нужно делать?
— Если действие должно выполняться 100 раз в секунду, а в секунде 1000 миллисекунд, значит, действие должно выполняться один раз в 10 миллисекунд.
Если твое действие занимает 2 миллисекунды, то нужно добавить к нему паузу длинной 8 миллисекунд. Вместе они будут выполняться как раз за 10 миллисекунд. И за секунду – как раз 100 раз.
Если же твое действие выполняется почти мгновенно, то поставь паузу (sleep) длиной 10 миллисекунд. Тогда в секунду будет тоже около 100 раз.