스레드(Thread) 안전하게 종료 시키는법 (interrupt)
스레드는 동시에 여러 작업을 수행할 수 있는 기능을 제공하여 병렬 처리를 가능하게 합니다. 그러나 스레드를 종료하기 위해서는 몇 가지 안전한 방법을 사용해야 합니다. 이 포스팅에서는 스레드를 안전하게 종료시키는 방법 중 하나인 interrupt
메소드에 대해 알아보겠습니다.
interrupt 메소드란?
interrupt
메소드는 현재 실행중인 스레드를 중단시키는데 사용됩니다. 이 메소드를 호출하면 스레드의 인터럽트 플래그(interrupt flag
)가 설정되며, 스레드는 중단되어 현재 작업을 종료할 수 있습니다. 스레드는 종료될 때 InterruptedException
을 발생시킬 수 있습니다.
interrupt 메소드의 사용 방법
interrupt 메소드 호출
다음과 같이 스레드 객체에 대해
interrupt
메소드를 호출하여 인터럽트 플래그를 설정할 수 있습니다.thread.interrupt();
인터럽트 플래그 확인
스레드는 중단될 때마다 인터럽트 플래그를 확인하고 작업을 중지하는 코드를 작성해야 합니다. 이를 위해
Thread
클래스의 정적 메소드인interrupted
나 인스턴스 메소드인isInterrupted
를 사용할 수 있습니다.if (Thread.interrupted()) { // 작업 중단 코드 } if (thread.isInterrupted()) { // 작업 중단 코드 }
interrupt 메소드의 예외 처리
interrupt 메소드를 호출하면 InterruptedException
이 발생할 수 있습니다. 이 예외는 스레드가 sleep
, wait
또는 join
메소드를 호출 중인 경우 발생할 수 있습니다. 따라서 interrupt
메소드를 사용하는 스레드의 코드는 반드시 예외 처리가 필요합니다.
try {
// 작업 코드
} catch (InterruptedException e) {
// 스레드 종료 처리
Thread.currentThread().interrupt(); // 인터럽트 플래그를 재설정하여 인터럽트를 유지
}
interrupt 메소드의 활용 사례
interrupt 메소드는 예상치 못한 상황에서 스레드를 안전하게 종료시킬 수 있습니다. 예를 들어, 네트워크 요청이 지연되는 경우나 무한 반복문에서 작업을 수행하던 중 사용자 입력을 기다리는 경우에 interrupt
메소드를 사용하여 스레드를 종료할 수 있습니다.
public class MyThread extends Thread {
public void run() {
try {
while (!Thread.interrupted()) {
// 작업 코드
}
} catch (InterruptedException e) {
// 스레드 종료 처리
Thread.currentThread().interrupt();
}
}
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
// 사용자 입력을 받아 interrupt 메소드 호출
Scanner scanner = new Scanner(System.in);
scanner.nextLine();
thread.interrupt();
}
이 예제에서는 MyThread
클래스의 run
메소드에서 작업을 수행하는 동안 interrupted
메소드를 사용하여 인터럽트 플래그를 확인합니다. 메인 메소드에서는 사용자의 입력을 받아 interrupt
메소드를 호출하여 스레드를 종료시킬 수 있습니다. 스레드는 인터럽트 플래그를 확인하고 작업을 중단하여 안전하게 종료됩니다.
이와 같은 방식으로 interrupt
메소드를 사용하면 스레드를 안전하게 종료시킬 수 있으며, 예기치 않은 상황에서 발생하는 문제를 예방할 수 있습니다. 정확한 예외 처리와 코드의 일관성을 유지하는 것이 중요하며, 각각의 상황에 맞는 적절한 종료 전략을 선택하는 것이 필요합니다.
댓글