[java] 스레드의 안정적 종료 방법

자바에서 스레드를 종료하는 방법은 중요한 주제 중 하나입니다. 안전하게 스레드를 종료하는 것은 프로그램의 안정성과 성능에 매우 중요한 영향을 미칩니다. 이 글에서는 스레드를 안정적으로 종료하는 몇 가지 방법에 대해 살펴보겠습니다.

1. 플래그 변수를 사용한 종료

가장 일반적인 스레드 종료 방법 중 하나는 플래그 변수를 사용하는 것입니다. 스레드의 실행 루프에서 플래그 변수를 확인하고, 종료할지 여부를 결정합니다. 종료를 원할 때, 플래그 변수를 true로 설정하여 스레드가 종료되도록 합니다.

다음은 플래그 변수를 사용한 스레드 종료 예제입니다.

public class MyThread extends Thread {
    private volatile boolean running = false;

    public void run() {
        running = true;
        while (running) {
            // 스레드 작업 수행
        }
    }

    public void stopThread() {
        running = false;
    }
}

위의 예제에서는 running이라는 플래그 변수를 사용하여 스레드의 실행 여부를 결정합니다. run 메서드에서 running 변수가 true인 동안 스레드 작업을 수행하고, stopThread 메서드에서 running 변수를 false로 설정하여 스레드를 종료시킵니다.

2. Interrupt 메서드를 사용한 종료

다른 스레드가 동작 중인 스레드를 중단시킬 수 있는 방법으로 Interrupt 메서드를 활용할 수 있습니다. Thread 클래스에는 interrupt 메서드가 제공되어 다른 스레드에서 호출될 때, 현재 스레드의 인터럽트 상태를 설정합니다. 스레드의 실행 루프에서는 isInterrupted 메서드를 사용하여 인터럽트 상태를 확인하고, 종료할지 여부를 결정합니다.

다음은 Interrupt 메서드를 사용한 스레드 종료 예제입니다.

public class MyThread extends Thread {
    public void run() {
        while (!isInterrupted()) {
            // 스레드 작업 수행
        }
    }
}

위의 예제에서는 isInterrupted 메서드를 사용하여 스레드의 인터럽트 상태를 확인하고, 작업을 수행합니다. 다른 스레드에서 interrupt 메서드가 호출될 때, isInterrupted 메서드는 true를 반환하게 되어 스레드가 종료됩니다.

3. ExecutorService를 사용한 종료

ExecutorService를 사용하면 스레드를 보다 효율적으로 관리할 수 있습니다. ExecutorService는 스레드 풀을 관리하고 작업을 처리하는 데 사용되는 인터페이스입니다. 스레드를 종료하기 위해서는 shutdown 또는 shutdownNow 메서드를 호출하여 ExecutorService를 종료시킬 수 있습니다.

다음은 ExecutorService를 사용한 스레드 종료 예제입니다.

public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 작업 추가
        executor.execute(new MyTask());

        // ExecutorService 종료
        executor.shutdown();
    }
}

public class MyTask implements Runnable {
    public void run() {
        // 작업 수행
    }
}

위의 예제에서는 ExecutorServiceshutdown 메서드를 호출하여 스레드 풀을 종료합니다. 현재 실행 중인 작업은 완료될 때까지 기다립니다.

결론

스레드의 안정적인 종료는 자바 프로그램의 안정성과 성능에 중요한 영향을 미칩니다. 이 글에서는 플래그 변수를 사용한 종료, Interrupt 메서드를 사용한 종료, 그리고 ExecutorService를 사용한 종료에 대해 알아보았습니다. 자신의 프로그램에 맞는 방법을 선택하여 스레드를 안정적으로 종료할 수 있도록 해야합니다. 참고할만한 자료로는 Oracle의 문서를 확인해볼 수 있습니다.