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) 블록 내에서 사용할 때는 주의가 필요합니다.
- 정확한 시간 보장은 아님: 운영체제 스케줄러의 상황에 따라 실제 대기 시간은 지정된 시간보다 약간 더 길어질 수 있습니다.