본문 바로가기
카테고리 없음

스레드(Thread) 안전하게 종료 시키는법 (interrupt)

by sftt 2023. 12. 7.

스레드(Thread) 안전하게 종료 시키는법 (interrupt)

스레드는 동시에 여러 작업을 수행할 수 있는 기능을 제공하여 병렬 처리를 가능하게 합니다. 그러나 스레드를 종료하기 위해서는 몇 가지 안전한 방법을 사용해야 합니다. 이 포스팅에서는 스레드를 안전하게 종료시키는 방법 중 하나인 interrupt 메소드에 대해 알아보겠습니다.

interrupt 메소드란?

interrupt 메소드는 현재 실행중인 스레드를 중단시키는데 사용됩니다. 이 메소드를 호출하면 스레드의 인터럽트 플래그(interrupt flag)가 설정되며, 스레드는 중단되어 현재 작업을 종료할 수 있습니다. 스레드는 종료될 때 InterruptedException을 발생시킬 수 있습니다.

interrupt 메소드의 사용 방법

  1. interrupt 메소드 호출

    다음과 같이 스레드 객체에 대해 interrupt 메소드를 호출하여 인터럽트 플래그를 설정할 수 있습니다.

    thread.interrupt();
  2. 인터럽트 플래그 확인

    스레드는 중단될 때마다 인터럽트 플래그를 확인하고 작업을 중지하는 코드를 작성해야 합니다. 이를 위해 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 메소드를 사용하면 스레드를 안전하게 종료시킬 수 있으며, 예기치 않은 상황에서 발생하는 문제를 예방할 수 있습니다. 정확한 예외 처리와 코드의 일관성을 유지하는 것이 중요하며, 각각의 상황에 맞는 적절한 종료 전략을 선택하는 것이 필요합니다.

댓글