CodeGym /Java блог /Случаен /Метод Thread.sleep() в Java
John Squirrels
Ниво
San Francisco

Метод Thread.sleep() в Java

Публикувано в групата
В програмите на Java има ситуации, когато една нишка се изпълнява твърде бързо or програмата трябва да превключи към друга нишка. За да направите това, трябва да спрете изпълнението на текущата нишка. В Java това може да се направи с помощта на метода java.lang.Thread.sleep() .

Метод Thread.sleep().

Класът Thread присъства в пакета Java.lang и съдържа метода Thread.sleep() . Методът Java.lang.thread sleep() се използва за спиране на текущата нишка за определен период от време в мorсекунди. Ако погледнете documentите на Oracle , ще откриете, че има два претоварени метода sleep() на класа Thread .

static void sleep(long millis)
където мorсекунди е времето в мorсекунди. Този метод кара текущо изпълняваната нишка да заспи (временно да спре изпълнението, „спяща“) за мorсекунди мorсекунди, в зависимост от прецизността на системните таймери и планировчици. Стойността на аргумента за мorсекунди не може да бъде отрицателна. Ако е така, ще бъде хвърлено изключение IllegalArgumentException .

static void sleep(long millis, int nanos)
където смила времето в мorсекунди, а nanos е времето в наносекунди. Този вариант на метода се използва за спиране на изпълнението на текущата нишка за точното време в мorсекунди и наносекунди. Стойността за наносекунда е валидна между 0 и 999999. Нека създадем проста програма, която използва метода Thread.sleep(), за да постави на пауза изпълнението на основната нишка за 5 секунди:

public class SleepDemo {

       public static void main(String[] args) throws InterruptedException {
           //the current time in milliseconds
           long start = System.currentTimeMillis();
           // stop the main thread of the program for 5000 milliseconds (5 seconds)
           Thread.sleep(5000);
           System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " milliseconds");
       }
}
Какво се случва в тази програма? Първо стартира, след това заспива за 5 мorсекунди (5 секунди), след което отпечатва на конзолата съобщение за това колко време е бил замразен и след това излиза. Резултатът е:
Нишката е на пауза за 5008 мorсекунди
Както можете да видите, програмата не спря за 5 секунди, а малко повече. Освен това, ако стартирате програмата на вашия компютър, ще забележите, че тя може да спре изпълнението на нишката за повече от 5000 мorсекунди и не е необходимо за 5008 мorсекунди. Въпросът е, че всичко зависи от операционната система и конкретната реализация на планировчика на нишки. Малко по-подробно, действителното време, което една нишка чака, преди да се събуди и започне изпълнението, зависи от системните таймери и планировчици. За тиха система действителното време за заспиване е близо до определеното време за заспиване, но за натоварена система ще бъде малко по-дълго. Този метод често се използва в дъщерни нишки, когато трябва да извършвате няHowво действие през цялото време, но не твърде често. Ето пример за програма, която отпечатва съобщение всяка секунда и никога не излиза:

public class SleepDemo1 {

   public static void main(String[] args) throws InterruptedException {
       while (true)
       {
           Thread.sleep(1000);
           System.out.println("One more second");
       }
   }
}

Важни точки на Java Thread Sleep

Важно е да запомните, че методът Java Thread Sleep работи по такъв начин, че:
  • Той винаги спира изпълнението на текущата нишка.

  • Действителната нишка спи, докато не се събуди, а времето за изпълнение зависи от системните таймери и планировчици.

  • Спящата нишка не блокира текущата нишка.

  • Всяка друга нишка може да прекъсне текущата спяща нишка, в който случай се хвърля InterruptedException .

  • Стойността на аргумента за мorсекунди не може да бъде отрицателна, в противен случай ще бъде хвърлено изключение IllegalArgumentException .

За да дадете пример за хвърляне на IllegalArgumentException , просто променете малко горната програма:

public class SleepDemo1 {

       public static void main(String[] args) throws InterruptedException {
           //the current time in milliseconds
           long start = System.currentTimeMillis();
           // stop the main thread of the program for 5000 milliseconds (5 seconds)
           Thread.sleep(-5000);
           System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " ms");
       }
}
Ето резултата:
Изключение в нишката "main" java.lang.IllegalArgumentException: стойността на времето за изчакване е отрицателна в java.base/java.lang.Thread.sleep(Native Method) в SleepDemo.main(SleepDemo.java:7)
По-горе заспиваме основната нишка. Сега нека се опитаме да приложим метода към друга нишка.

// Java Program to sleep the custom thread
public class SleepDemo2 extends Thread{

       public void run()
       {
           // thread 0
           try {
               for (int i = 0; i < 10; i++) {

                   // sleeps the main thread for about 2 seconds
                   Thread.sleep(2000);
                   System.out.println(i);
               }
           }
           catch (Exception e) {

               // catching the exception
               System.out.println(e);
           }
       }
       public static void main(String[] args)
       {
           SleepDemo2 sleepDemo2 = new SleepDemo2();
           sleepDemo2.start();
       }
}
Резултатът е:
0 1 2 3 4 5 6 7 8 9
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION