Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 동시성 – Thread.sleep() 메서드 완벽 이해하기


Thread.sleep() 메서드란?

Thread.sleep() 메서드는 현재 실행 중인 스레드를 매개변수로 전달된 밀리초(1/1000초) 단위의 시간 동안 일시 정지시키는 역할을 합니다. 지정된 시간이 경과하면 스레드는 다시 실행 가능한(runnable) 상태로 전환되어 CPU 할당을 기다리게 됩니다.

이 메서드는 java.lang.Thread 클래스에 포함된 정적(static) 메서드로, 스레드 간 작업 간격을 조절하거나 특정 타이밍 제어가 필요할 때 자주 활용됩니다.

예제 코드

두 개의 스레드가 sleep() 메서드를 사용하면서 어떻게 번갈아 실행되는지 살펴보겠습니다.

import java.lang.*;
public class Demo implements Runnable{
   Thread my_t;
   public void run(){
      for (int i = 0; i < 3; i++){
         System.out.println(Thread.currentThread().getName()+ " " + i);
         try{
            Thread.sleep(100);
         }
         catch (Exception e){
            System.out.println(e);
         }
      }
   }
   public static void main(String[] args) throws Exception{
      Thread my_t = new Thread(new Demo());
      my_t.start();
      Thread my_t2 = new Thread(new Demo());
      my_t2.start();
   }
}

실행 결과

Thread-0 0
Thread-1 0
Thread-0 1
Thread-1 1
Thread-0 2
Thread-1 2

코드 설명

위 예제에서 Demo 클래스는 Runnable 인터페이스를 구현하여 새로운 스레드를 정의합니다. run() 메서드 내부에는 반복문이 있으며, 각 반복마다 getName() 메서드를 통해 현재 스레드의 이름을 가져와 함께 출력합니다.

try 블록 안에서 Thread.sleep(100)이 호출되어 스레드가 100밀리초 동안 일시 정지되고, 실행 중 예외가 발생하면 catch 블록이 이를 받아 화면에 출력합니다.

main() 메서드에서는 두 개의 Thread 인스턴스를 생성한 뒤 start() 메서드를 호출하여 실행합니다. 그 결과 두 스레드가 교차로 실행되며, 각 스레드는 숫자를 하나 출력할 때마다 100밀리초씩 대기하게 됩니다. 이러한 대기 덕분에 두 스레드의 출력이 위 실행 결과처럼 번갈아 나타나는 것입니다.

sleep() 메서드의 주요 특징

  • 정적 메서드: 항상 '현재 실행 중인 스레드'에만 적용되며, 특정 스레드 객체를 지정해서 잠들게 할 수는 없습니다.
  • 예외 처리 필수: 대기 중에 다른 스레드가 interrupt()를 호출하면 InterruptedException이 발생하므로, 반드시 try-catch 또는 예외 선언으로 처리해야 합니다.
  • 락(lock)은 유지됨: sleep() 상태의 스레드도 이미 획득한 모니터 락은 놓지 않기 때문에, 동기화(synchronized) 블록 내에서 사용할 때는 주의가 필요합니다.
  • 정확한 시간 보장은 아님: 운영체제 스케줄러의 상황에 따라 실제 대기 시간은 지정된 시간보다 약간 더 길어질 수 있습니다.