Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바에서 스레드를 안전하게 종료하는 방법

자바에는 스레드를 강제로 종료하는 직접적인 메서드가 없습니다. 과거에 사용되던 Thread.stop()은 교착 상태나 데이터 불일치 같은 심각한 문제를 일으킬 수 있어 현재는 사용이 권장되지 않습니다(deprecated). 대신 가장 널리 쓰이는 안전한 방법은 volatile boolean 플래그 변수를 활용해 스레드가 스스로 실행을 멈추도록 유도하는 것입니다.

예제 코드

public class Main{
    static volatile boolean exit = false;
    public static void main(String[] args){
        System.out.println("Starting the main thread");
        new Thread(){
            public void run(){
                System.out.println("Starting the inner thread");
                while (!exit){
                }
                System.out.println("Exiting the inner thread");
            }
        }.start();
        try{
            Thread.sleep(100);
        }
        catch (InterruptedException e){
            System.out.println("Exception caught :" + e);
        }
        exit = true;
        System.out.println("Exiting main thread");
    }
}

실행 결과

Starting the main thread
Starting the inner thread
Exiting main thread
Exiting the inner thread

코드 동작 원리

메인 클래스는 새로운 스레드를 생성하고 run() 메서드를 통해 작업을 시작합니다. 여기서 핵심 역할을 하는 것이 초기값이 false로 설정된 boolean 타입의 exit 변수입니다.

내부 스레드는 while (!exit) 조건문을 반복하며 대기합니다. 이때 exit 변수가 volatile로 선언되어 있다는 점이 중요합니다. volatile 키워드 덕분에 한 스레드에서 변경한 값이 다른 스레드의 CPU 캐시에 남아 있지 않고 항상 최신 값을 읽게 되어, 플래그 변경이 즉시 반영됩니다.

메인 스레드는 try 블록에서 Thread.sleep(100)을 호출해 100밀리초 동안 대기합니다. 만약 대기 중 인터럽트가 발생하면 InterruptedException이 catch 블록에서 처리되며 관련 메시지가 화면에 출력됩니다.

대기가 끝나면 메인 스레드는 exit 값을 true로 변경합니다. 그러면 내부 스레드의 while 루프 조건이 거짓이 되어 루프를 빠져나오고, "Exiting the inner thread" 메시지를 출력한 뒤 자연스럽게 종료됩니다. 마지막으로 메인 스레드도 종료되며 프로그램 전체가 마무리됩니다.

정리

  • 스레드 강제 종료(Thread.stop())는 위험하므로 사용하지 않습니다.
  • volatile boolean 플래그를 사용하면 스레드가 안전하게 스스로 종료할 수 있습니다.
  • 플래그 검사 주기가 긴 작업이라면 루프 안에 적절한 sleep()이나 인터럽트 체크를 함께 두는 것이 좋습니다.