본문 바로가기
Java

쓰레드(Thread) 종료 방법 stop 플래그, interrupt()

by jayden-lee 2019. 4. 11.
728x90

쓰레드(Thread)는 run() 메소드가 모두 실행되면 자동적으로 종료된다. 어떤 경우에는 모든 작업을 수행하기 전에 쓰레드 수행을 즉시 종료 시켜야하는 상황도 생길 수 있다. 예를 들어, 크롬에서 어떤 프로그램을 다운로드를 받는 도중에 사용자가 취소 버튼을 눌러서 다운로드 중인 작업을 취소할 수 있다.

 

Thread에는 작업을 즉시 종료시키는 stop() 메서드를 제공했지만 이제는 deprecated이 되었다. deprecated가 되었다는 이유는 어느 문제로 인해서 해당 메서드를 사용하지 않는 것을 권고한다는 것을 의미한다.

 

stop() 메서드는 쓰레드를 종료시킴에 따라 쓰레드가 사용중인 자원들을 불완전한 상태로 남겨 놓는다. 자원이란 것은 데이터베이스 연결 하는 커넥션 자원, 네트워크 연결을 사용하는 자원, 파일 자원 등이 있다. 이러한 자원들은 사용하고 나서 close() 라는 메서드 호출을 통해 자원을 반납하거나 종료시켜야 한다. 그렇지 않으면 자원이 누수하는 문제가 발생하게 된다.

 

stop() 메서드를 사용하지 않고 쓰레드를 종료시키는 방법인 stop 플래그interrupt()에 대해 알아보자.

1. stop 플래그 방법

public class StopFlagThread extends Thread {
    // stop 플래그 변수
    private boolean isStop;

    @Override
    public void run() {
        while (!isStop) {
            // 스레드 작업 코드
        }

        // 스레드 자원 정리
    }

    public void setStop(boolean isStop) {
        this.isStop = isStop;
    }
}

2. interrupt() 메서드 이용하는 방법

interrupt() 메서드는 쓰레드가 일시 정지 상태에 있을 때 InterruptedException 예외를 발생시키는 역할을 한다. 스레드의 상태가 일시 정지 상태여야 한다. 실행 대기 또는 실행 상태에 있을 때는 interrupt() 메서드를 호출해도 스레드는 InterruptedException 예외가 발생하지 않는다.

 

해당 스레드가 일시 정지 상태가 되면 그때 예외가 발생한다. 스레드의 상태를 바꾸려고 Thread.sleep(시간) 메서드를 사용하기도 한다.

public class InterruptThread extends Thread {

    @Override
    public void run() {
        try {
            while (true) {
                System.out.println("실행중");
                Thread.sleep(1000); // 일시 정지 상태로 변경
            }
        } catch (InterruptedException ex) {
            System.err.println(ex.getMessage());
        }
        System.out.println("자원정리");
    }
}

쓰레드를 일시 정지 상태로 만들지도 않고 interrupt() 호출 여부를 알 수 있는 방법이 있다. 정적 메서드의 interrupted() 또는 현재 쓰레드의 isInterrupted() 메서드가 있다.

boolean threadStatus = Thread.interrupted();
boolean threadStatus2 = thread.isInterrupted();

댓글