Java задержка выполнения кода

Как отложить выполнение кода в Java

Программы на Java довольно часто добавляют задержку или паузу в своей работе. Это может быть полезно для стимуляции задачи или для приостановки выполнения до завершения другой задачи.

В этом руководстве будут описаны два способа реализации задержек в Java.

2. Подход на основе потоков ​

Когда программа Java запускается, она порождает процесс , который выполняется на хост-компьютере. Этот процесс содержит как минимум один поток — основной поток , в котором выполняется программа. Кроме того, Java поддерживает многопоточность , что позволяет приложениям создавать новые потоки, работающие параллельно или асинхронно с основным потоком.

2.1. Использование Thread.sleep ​

Быстрый и грязный способ сделать паузу в Java — это указать текущему потоку спать в течение определенного периода времени. Это можно сделать с помощью Thread.sleep(миллисекунды) :

 try    Thread.sleep(secondsToSleep * 1000);   > catch (InterruptedException ie)    Thread.currentThread().interrupt();   > 

Хорошей практикой является заключение метода sleep в блок try/catch на случай, если другой поток прервет спящий поток. В этом случае мы перехватываем InterruptedException и явно прерываем текущий поток, чтобы его можно было перехватить и обработать позже. Это более важно в многопоточной программе, но все же является хорошей практикой в однопоточной программе на случай, если позже мы добавим другие потоки.

2.2. Использование TimeUnit.sleep ​

Для лучшей читаемости мы можем использовать TimeUnit.XXX.sleep(y) , где XXX — это единица времени, в течение которой нужно спать ( SECONDS , MINUTES и т. д .), а y — количество единиц, в течение которых нужно спать. Это использует Thread.sleep за кулисами. Вот пример синтаксиса TimeUnit :

 try    TimeUnit.SECONDS.sleep(secondsToSleep);   > catch (InterruptedException ie)    Thread.currentThread().interrupt();   > 

Однако использование этих методов на основе потоков имеет некоторые недостатки :

  • Время сна не совсем точное, особенно при использовании меньших приращений времени, таких как миллисекунды и наносекунды.
  • При использовании внутри циклов сон будет немного дрейфовать между итерациями цикла из-за выполнения другого кода, поэтому время выполнения может стать неточным после многих итераций.

3. Подход на основе ExecutorService ​

Java предоставляет интерфейс ScheduledExecutorService , который является более надежным и точным решением. Этот интерфейс может запланировать выполнение кода один раз после указанной задержки или через фиксированные интервалы времени.

Чтобы запустить фрагмент кода один раз после задержки, мы можем использовать метод расписания :

 ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();   executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS); 

В части Classname::someTask мы указываем метод, который будет выполняться после задержки:

  • someTask — это имя метода, который мы хотим выполнить.
  • Classname — это имя класса, содержащего метод someTask.

Чтобы запускать задачу через фиксированные промежутки времени, мы можем использовать метод scheduleAtFixedRate :

 ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();   executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS); 

Это приведет к многократному вызову метода someTask с паузой delayInSeconds между каждым вызовом.

Помимо предоставления дополнительных параметров времени, метод ScheduledExecutorService дает более точные временные интервалы, поскольку он предотвращает проблемы с дрейфом.

4. Вывод​

В этой статье мы обсудили два метода создания задержек в программах на Java.

Полный код этой статьи можно найти на Github . Это проект на основе Maven, поэтому его легко импортировать и запускать как есть.

Источник

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 .

Источник

Метод 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

Относительно часто программы Java добавляют задержку или паузу в свою работу. Это может быть полезно для ускорения выполнения задачи или для приостановки выполнения до завершения другой задачи.

В этом руководстве будут описаны два способа реализации задержек в Java.

2. Подход, Основанный На Потоках

Когда запускается программа Java, она порождает процесс , который выполняется на хост-машине. Этот процесс содержит по крайней мере один поток – основной поток – в котором выполняется программа. Кроме того, Java позволяет многопоточность , что позволяет приложениям создавать новые потоки, которые выполняются параллельно или асинхронно с основным потоком.

2.1. Использование Thread.sleep

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

try < Thread.sleep(secondsToSleep * 1000); >catch (InterruptedException ie)

Рекомендуется обернуть метод sleep в блок try/catch на случай, если другой поток прерывает спящий поток. В этом случае мы перехватываем исключение InterruptedException и явно прерываем текущий поток, чтобы его можно было перехватить позже и обработать. Это более важно в многопоточной программе, но все же хорошая практика в однопоточной программе на случай, если мы добавим другие потоки позже.

2.2. Использование TimeUnit.sleep

Для лучшей читаемости мы можем использовать TimeUnit.XXX.sleep(y) , Где XXX – единица времени для сна ( СЕКУНДЫ , МИНУТЫ и т. Д.), А y – номер этой единицы для сна. Это использует Thread.sleep за кулисами. Вот пример синтаксиса Единицы времени :

try < TimeUnit.SECONDS.sleep(secondsToSleep); >catch (InterruptedException ie)

Однако есть некоторые недостатки в использовании этих методов на основе потоков :

  • Время сна не совсем точно, особенно при использовании меньших временных приращений, таких как миллисекунды и наносекунды
  • При использовании внутри циклов сон будет немного смещаться между итерациями цикла из-за выполнения другого кода, поэтому время выполнения может стать неточным после многих итераций

3. Подход, Основанный На ExecutorService

Java предоставляет интерфейс ScheduledExecutorService, который является более надежным и точным решением. Этот интерфейс может запланировать выполнение кода один раз после указанной задержки или через фиксированные интервалы времени.

Чтобы запустить фрагмент кода один раз после задержки, мы можем использовать метод schedule :

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);

Имя класса :: некоторая задача часть, в которой мы указываем метод, который будет выполняться после задержки:

  • некоторая задача – это имя метода, который мы хотим выполнить
  • Имя класса – это имя класса, содержащего ту же задачу метод

Для выполнения задачи с фиксированными интервалами времени мы можем использовать метод scheduleAtFixedRate :

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);

Это приведет к многократному вызову метода некоторой задачи , делая паузу для задержки В секундах между каждым вызовом.

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

4. Заключение

В этой статье мы обсудили два метода создания задержек в программах Java.

Полный код этой статьи можно найти на Github . Это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.

Читайте ещё по теме:

Источник

Читайте также:  Python dataframe объединение таблиц
Оцените статью