Java에서 멀티스레딩을 다루다 보면 sleep()과 wait() 메서드를 자주 접하게 됩니다. 두 메서드 모두 스레드의 실행을 일시적으로 멈추는 역할을 하지만, 동작 방식과 사용 목적은 크게 다릅니다. 이 글에서는 두 메서드의 핵심 차이점을 자세히 살펴보겠습니다.
wait() 메서드란?
wait() 메서드는 Object 클래스에 정의되어 있으며, 주로 스레드 간 통신(inter-thread communication)에 사용됩니다.
소속 클래스: Object 클래스에 속합니다.
락 처리: 동기화가 진행되는 동안 해당 객체의 락(lock)을 해제합니다. 이를 통해 다른 스레드가 객체를 사용할 수 있게 됩니다.
메서드 유형: 정적(static) 메서드가 아닌 인스턴스 메서드입니다.
호출 조건: 반드시 동기화된(synchronized) 컨텍스트 내에서만 호출해야 하며, 그렇지 않으면
IllegalMonitorStateException이 발생합니다.오버로드: 세 가지 오버로드된 형태가 존재합니다.
wait()wait(long timeout)wait(long timeout, int nanoseconds)
sleep() 메서드란?
sleep() 메서드는 Thread 클래스에 정의된 정적 메서드로, 현재 실행 중인 스레드를 지정된 시간 동안 일시 정지시킵니다.
소속 클래스: Thread 클래스에 속합니다.
락 처리: 동기화가 진행되는 동안에도 객체의 락을 해제하지 않습니다. 즉, 다른 스레드가 해당 객체에 접근할 수 없습니다.
메서드 유형: 정적(static) 메서드입니다.
호출 조건: 동기화된 컨텍스트에서 호출할 필요가 없으며, 어디서든 호출할 수 있습니다.
오버로드: 두 가지 오버로드된 형태가 존재합니다.
sleep(long millis)— millis: 밀리초(천 분의 일 초) 단위sleep(long millis, int nanos)— nanos: 나노초(십억 분의 일 초) 단위
sleep()과 wait() 비교 요약
| 구분 | wait() | sleep() |
|---|---|---|
| 소속 클래스 | Object | Thread |
| 락 해제 여부 | 락을 해제함 | 락을 해제하지 않음 |
| 메서드 유형 | 인스턴스 메서드 | 정적(static) 메서드 |
| 호출 위치 | synchronized 블록/메서드 내에서만 호출 가능 | 동기화 컨텍스트와 무관하게 호출 가능 |
| 주요 용도 | 스레드 간 통신 및 협력 | 스레드 일시 정지 |
정리하면, wait()은 스레드 간 협력과 통신을 위해 락을 반납하며 대기하는 반면, sleep()은 단순히 지정된 시간 동안 스레드를 멈추고 락은 그대로 유지합니다. 두 메서드의 차이를 정확히 이해하고 상황에 맞게 사용하는 것이 안정적인 멀티스레드 프로그램을 작성하는 핵심입니다.