자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
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 |