[Java] Thread.sleep()과 InterruptedException

MEUN·2024년 10월 23일
0

Thread.sleep()

Thread.sleep() 은 Thread가 특정 시간동안 대기해야 할 때 사용되는 메서드

테스트 시 사용되는 등 종종 아래와 같이 사용될 때가 있음

예시

public static void sleep(long millis) {
    try {
        Thread.sleep(millis);
    } catch (**InterruptedException ex**) {
        // 적절히 처리 필요!
    }
}


InterruptedExcpetion

위와 같이 Thread.sleep() 에서 지정한 시간이 지나면 발생하는 체크 예외로, 아래 조건에서 발생

발생 원인

  • Thread가 대기중 또는 Thread.sleep()와 같이 수면중이거나 다른 방식으로 점유중일 때 발생하고, 활동 전 또는 활동 중에 스레드가 중단될 때 발생

활용 방안

현재 스레드의 인터럽트 여부 확인 후 아래와 같이 예외 발생시킬 수 있음

if (thread.interrupted()) throw new InterruptedException();


인터럽트란?

Thread에 하던 일을 중단하라는 신호를 보내기 위해 사용

동작 방식

  1. 특정 Thread에 인터럽트를 발생시키기 위해 해당 Thread의 interrupt() 메서드 호출
  2. 해당 Thread의 인터럽트 플래그가 true 로 변경
  3. 특정 조건에 해당되지 않는 경우 현재 Thread에 인터럽트 상태 설정 (interrupt() 참고)

인터럽트 발생 여부 확인 방안

  1. InterruptedException 예외가 발생 여부 확인 (❌)
    • 인터럽트 발생 시 항상 예외가 발생하는 것이 아니므로 올바른 방법이 아님
  2. interrupted(), isInterrupted() 호출을 통해 Thread 내 인터럽트 플래그 확인 (⭕)

유관 메서드

interrupt()

public void interrupt()
  • 현재 Thread가 수정될 수 없는 상태인 경우 SecurityException 발생 가능
  • 아래 조건에 해당되지 않는 경우 현재 Thread에 인터럽트 상태 설정
    • wait(), join(), sleep() 메서드에서 호출이 차단되면 인터럽트 플래그가 false로 변경되고 InterruptedException 발생
    • Thread가 InterruptibleChannel 의 I/O 작업에서 블로킹된 상태인 경우 인터럽트 플래그가 true로 설정되고 ClosedByInterruptException 발생
    • Selector에서 차단된 경우 Thread 인터럽트 플래그를 true로 설정 후 선택 작업을 0이 아닌 값으로 즉시 반환
  • 살아 있지 않은 Thread를 인터럽트하면 소용 없음

💡 InterruptibleChannel이란?

  • java.nio.channels 패키지 내 클래스로, 비동기적으로 닫고 중단 가능한 네트워크 연결에 사용되는 채널
  • FileChannel, SocketChannel 등이 해당 인터페이스를 구현

💡 Selector란?

  • Non-Blocking I/O 연산을 관리하는 데 사용
  • 단일 스레드로 여러 네트워크 채널의 I/O 이벤트를 효율적으로 처리 가능

interrupted()

public static boolean interrupted()
  • 현재 Thread의 중단 여부 판단
  • 호출 시 Thread가 인터럽트 상태라면 true 반환 후 인터럽트 플래그는 false로 변경됨
  • 살아 있지 않은 Thread인 경우 false 반환

isInterrupted()

public boolean isInterrupted()
  • 현재 Thread의 중단 여부 판단
  • interrupted()와 달리 인터럽트 플래그 변경을 진행하지 않음
  • 살아 있지 않은 Thread인 경우 false 반환


📚 참고 자료

0개의 댓글