Java/자바 정리

136. interrupt()로 스레드 종료하기 – sleep 중인 스레드 깨우기

코딩하는냥이 2025. 5. 19. 14:57
반응형

스레드를 안전하게 종료하는 또 다른 방법은 interrupt()를 활용하는 방식입니다.
이 방법은 스레드가 sleep(), wait() 등으로 일시정지 상태일 때 강제로 깨워서 종료 흐름으로 전환할 수 있습니다.
특히 외부에서 스레드의 종료를 제어해야 할 경우 자주 사용되는 방식입니다.


📦 PrintThread.java

package ch14.sec07.exam02;

public class PrintThread extends Thread {
	public void run() {
		try {
			while (true) {
				System.out.println("실행 중");
				Thread.sleep(1);  // 잠시 대기하며 반복
			}
		} catch (Exception e) {
			// interrupt()로 인해 예외 발생
		}
		System.out.println("리소스 정리");
		System.out.println("실행 종료");
	}
}

📌 예제 코드

package ch14.sec07.exam02;

public class InterruptExample {
	public static void main(String[] args) {
		Thread thread = new PrintThread();
		thread.start();
		
		try {
			Thread.sleep(1000);  // 1초 동안 실행
		} catch (Exception e) {
			// 예외 처리 생략
		}
		
		thread.interrupt();  // 스레드 종료 요청
	}
}

💻 실행 결과

실행 중
실행 중
...
리소스 정리
실행 종료

※ "실행 중" 메시지가 반복되다가, interrupt() 호출 이후 예외가 발생하면서 스레드가 종료됩니다.


💬 코드 설명

  • PrintThread는 무한 루프 안에서 "실행 중"을 출력하고, Thread.sleep(1)로 잠시 대기합니다.
  • InterruptExample 클래스에서는 1초 뒤 thread.interrupt()를 호출하여 해당 스레드에 인터럽트 요청을 보냅니다.
  • 이 요청으로 인해 Thread.sleep()에서 InterruptedException이 발생하고,
    catch 블록 이후 "리소스 정리" 및 "실행 종료"가 출력되며 스레드가 종료됩니다.
  • 즉, interrupt()는 sleep 상태의 스레드를 깨워 정상 종료 흐름으로 이동시켜 주는 역할을 합니다.

💡 포인트 정리

  • interrupt()는 스레드가 sleep(), wait(), join() 상태일 때만 예외를 발생시킵니다.
  • 일반적인 루프 안에서는 Thread.interrupted() 같은 메서드를 활용해야 정상적으로 종료를 감지할 수 있습니다.
  • 외부에서 스레드를 종료할 필요가 있을 때, interrupt()는 가장 안전하고 효과적인 방법 중 하나입니다.
  • 예외 처리 후 리소스 정리나 종료 메시지를 반드시 작성해주시는 것이 좋습니다.

📌정리하자면, interrupt()는 외부에서 스레드를 안전하게 종료할 수 있는 방법으로,
특히 스레드가 sleep() 상태일 때 유용하게 사용됩니다.
이번 예제처럼 예외를 통해 종료 흐름으로 전환하면, 강제 종료 없이도 자연스럽게 스레드를 정리할 수 있습니다.
스레드 종료 시에는 항상 예외 처리와 리소스 해제를 함께 고려해주시는 것이 좋습니다.