Java 프로그램에는 스레드가 너무 빨리 실행되거나 프로그램이 다른 스레드로 전환해야 하는 상황이 있습니다. 이렇게 하려면 현재 스레드의 실행을 일시 중단해야 합니다. Java에서는 java.lang.Thread.sleep() 메서드를 사용하여 이 작업을 수행할 수 있습니다.

Thread.sleep() 메서드

Thread 클래스는 Java.lang 패키지에 있으며 Thread.sleep() 메서드 포함합니다 . Java.lang.thread sleep() 메서드는 지정된 시간(밀리초) 동안 현재 스레드를 일시 중단하는 데 사용됩니다. Oracle 문서를 보면 Thread 클래스 의 두 가지 오버로드된 sleep() 메서드 가 있음을 알 수 있습니다 .

static void sleep(long millis)
여기서 millis는 밀리초 단위의 시간입니다. 이 방법은 현재 실행 중인 스레드를 시스템 타이머 및 스케줄러의 정밀도에 따라 밀리초 동안 잠자기(일시적으로 실행 중지, "수면") 상태로 만듭니다. 밀리초에 대한 인수 값은 음수가 될 수 없습니다. 그렇다면 IllegalArgumentException 이 발생합니다.

static void sleep(long millis, int nanos)
여기서 mills는 밀리초 단위의 시간이고 nanos는 나노초 단위의 시간입니다. 이 방법의 변형은 정확한 시간(밀리초 및 나노초) 동안 현재 스레드의 실행을 일시 중단하는 데 사용됩니다. 나노초 값은 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밀리초(5초) 동안 휴면 상태가 된 다음 콘솔에 얼마나 오랫동안 정지되었는지에 대한 메시지를 인쇄한 다음 종료됩니다. 출력은 다음과 같습니다.
스레드가 5008밀리초 동안 일시 중지됩니다.
보시다시피 프로그램은 5초 동안 멈추지 않고 조금 더 길게 멈춥니다. 또한 컴퓨터에서 프로그램을 실행하면 5000밀리초 이상 동안 스레드 실행을 중지할 수 있으며 5008밀리초 동안은 필요하지 않음을 알 수 있습니다. 요점은 모든 것이 운영 체제와 스레드 스케줄러의 특정 구현에 따라 다르다는 것입니다. 조금 더 자세히 설명하면 스레드가 깨어나서 실행을 시작하기 전에 대기하는 실제 시간은 시스템 타이머와 스케줄러에 따라 다릅니다. 조용한 시스템의 경우 실제 절전 시간은 지정된 절전 시간에 가깝지만 로드된 시스템의 경우 약간 더 깁니다. 이 방법은 어떤 작업을 항상 수행해야 하지만 너무 자주는 아닌 경우 자식 스레드에서 자주 사용됩니다. 다음은 매초 메시지를 출력하고 절대 종료하지 않는 프로그램의 예입니다.

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이 발생합니다.

  • 밀리초에 대한 인수 값은 음수가 될 수 없습니다. 그렇지 않으면 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의 예외: SleepDemo.main(SleepDemo.java:7)의 java.base/java.lang.Thread.sleep(네이티브 메서드)에서 시간 초과 값이 음수입니다.
위에서 메인 스레드를 잠들게 했습니다. 이제 메서드를 다른 스레드에 적용해 보겠습니다.

// 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