Java

sleep(), interrupt()

1space 2025. 6. 27. 14:41

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.

sleep() 메서드 설명

핵심 개념

  • Thread.sleep()은 현재 쓰레드를 일정 시간 동안 멈추게(잠자게) 하는 메서드입니다.
  • 정적 메서드(static)이므로 Thread.sleep()처럼 클래스 이름으로 호출합니다.
  • 다른 쓰레드를 지정해서 멈추게 할 수는 없습니다. 자기 자신만 멈출 수 있습니다.

메서드 정의

static void sleep(long millis)
static void sleep(long millis, int nanos)
  • millis는 천분의 1초 (즉, 밀리초 단위)
  • nanos는 10억분의 1초 (즉, 나노초 단위)

예시: sleep(3 * 1000) → 3초 동안 멈춤

⚠️ 예외 처리 필수

sleep()을 사용하면 반드시 try-catch로 감싸야 합니다.
왜냐하면 InterruptedException이 발생할 수 있기 때문입니다.

try {
    Thread.sleep(1, 500000);  // 0.0015초 (1ms + 500,000ns)
} catch (InterruptedException e) {}

 

delay 함수 만들기

 
void delay(long millis) {
    try {
        Thread.sleep(millis);
    } catch (InterruptedException e) {}
}

 

잘못된 사용 예시

t1.sleep(2000);  // ❌ 다른 쓰레드를 sleep시키는 건 불가능!

→ sleep()은 정적 메서드이기 때문에 이렇게 객체로 호출하는 건 잘못된 방식입니다.

 

interrupt() 메서드 설명

핵심 개념

  • interrupt()는 대기 상태(wait, sleep, join 등)에 있는 쓰레드를 깨워서 실행대기 상태(RUNNABLE)로 만듭니다.
  • 혹은, while 루프 등에서 isInterrupted()로 인터럽트 상태를 감지하여 종료 조건으로 활용할 수 있습니다.

관련 메서드

void interrupt()               // 쓰레드의 interrupt 상태를 true로 바꿈
boolean isInterrupted()        // 해당 쓰레드의 interrupt 상태 확인 (true/false)
static boolean interrupted()   // 현재 쓰레드의 interrupt 상태 확인 후, 자동으로 false로 초기화됨

주요 흐름 설명

ThreadEx13_2 th1 = new ThreadEx13_2();
th1.start();           // 쓰레드 시작
th1.interrupt();       // 쓰레드 깨우기(interrupt 상태 true로 바뀜)

클래스 내부 구현

class ThreadEx13_2 extends Thread {
    public void run() {
        while (!isInterrupted()) {
            // 다운로드 작업 수행
        }
        System.out.println("다운로드가 끝났습니다.");
    }
}
  • 반복문 안에서 isInterrupted()가 true가 되면 루프 종료.
  • 이때 interrupt()를 통해 외부에서 중단시킬 수 있음.

내부 필드 이해

boolean interrupted = false;
boolean isInterrupted() { return interrupted; }
void interrupt() { interrupted = true; }

→ 실제 내부적으로 이런 플래그로 상태를 추적합니다.

정리

sleep() 현재 쓰레드를 일정 시간 멈춤 (예외처리 필요)
interrupt() sleep() 또는 wait() 등에서 깨움 / 반복문 종료 조건에도 활용
isInterrupted() 해당 쓰레드의 인터럽트 상태 확인 (true/false)
interrupted() 현재 쓰레드의 상태 확인 후 false로 초기화

'Java' 카테고리의 다른 글

join(), yield()  (0) 2025.06.27
suspend(), resume()  (0) 2025.06.27
쓰레드의 상태  (0) 2025.06.27
데몬 쓰레드  (0) 2025.06.27
쓰레드 그룹  (0) 2025.06.27