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

스레드는 자신의 run()메소드가 모두 실행되면 자동으로 종료됩니다. 하지만 경우에 따라서는 실행중인 스레드를 종료할때도 있을텐데요. 스레드를 즉시 종료시키기 위해서 stop() 메소드를 제공하고 있는데, 이는 실제로 잘 사용하지 않습니다. 그 이유는 stop() 메소드는 쓰레드가 사용 중이던 자원들이 불완전한 상태로 남겨지기 때문입니다. 

 

interrupt() 메서드를 활용하여 스레드(Thread)안전하게 종료하기

가장 안전하게 스레드를 정상 종료시키려면 interrupt() 메소드를 사용하면 됩니다. interrupt() 메소드는 스레드가 일시 정지 상태에 있을 때 InterruptedException 예외를 발생시키는 역할을 합니다.  여기서 주목할 점은 interrupt() 메소드를 이용하기 위해서는 종료시키고 싶은 메소드가 일시 정지 상태일 때 정지가 된다는 것입니다. 왜냐하면, 스레드가 실행 대기 또는 실행 상태에 있을 때 interrupt() 메소드가 실행되면 즉시 InterruptedException 예외가 발생하지 않고, 스레드가 미래에 일시 정지 상태가 되면 InterruptedException 예외가 발생한다는 것입니다. 따라서 스레드가 일시 정지 상태가 되지 않으면 interrupt() 메소드 호출은 아무런 의미가 없습니다.

간단한 예제

class InterruptedThread implements Runnable {
		
    public void run() {
        try {
            while(!Thread.currentThread().isInterrupted()) {
                System.out.println("스레드 동작");
                Thread.sleep(100);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println("\n종료");
        }
    }
	
    void process(){
        Runnable interruptedThread = new InterruptedThread();
        Thread thread = new Thread(interruptedThread);
        thread.start();
        try {
            Thread.sleep(1000);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt(); // InterruptedException 발생
    }
}

public class ex1 {
    public static void main(String[] args) {
        System.out.println("시작");
        InterruptedThread interruptedThreadTest = new InterruptedThread();
        interruptedThreadTest.process();
    }
}

스레드 종료 예제

댓글

Designed by JB FACTORY