Перейти к контенту

Метод 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 = "+(System.currentTimeMillis()-start));
        
    }

}

Если вы запустите эту программу, вы заметите, что время ожидания потока, которое она печатает, немного больше, чем 2000. Это вызвано тем, как работает режим ожидания потока, и конкретной реализацией планировщика потока в операционной системе.

Важно знать, что

  • Всегда приостанавливает выполнение текущего потока.
  • Фактический поток «спит» до пробуждения, и время выполнения зависит от системных таймеров и планировщиков.
  • Спящий поток не блокирует текущий поток.
  • Любой другой поток может прервать текущий поток в спящем режиме, в этом случае создается исключение InterruptedException.

Еще пример с использованием метода java.lang.Thread.sleep().

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

Оцени статью

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

 

Пока нет комментариев.

Добавить комментарий

Ваш e-mail не будет опубликован.

СайдбарКомментарии (0)