본문 바로가기

Programming/JAVA

멀티 스레드(6) - 스레드 상태 제어 6 : 스레드의 안전한 종료 1

 

 

 

지금까지 살펴온 내용을 바탕으로 본다면, 스레드는 기본적으로 run( ) 메서드가 모두 실행되고 나면 자동으로 종료하게 되어 있습니다. 하지만, 경우에 따라 run( ) 메서드가 다 실행되지 않았어도 스레드를 즉시 종료할 필요성이 생기기도 합니다(영상 재생이 안 끝났는데 사용자가 중단하는 경우와 같이).

 

원래 Thread에서는 이런 즉시 종료를 위한 stop( ) 메서드가 제공되었었는데, 현재는 불안정성으로 인해 deprecated 되었습니다. 이를 제외한 스레드 즉시 중단 방법에 대해서 살펴보겠습니다. 

 

 

○ stop 플래그 사용하기

 

스레드는 run( ) 메서드가 끝남과 동시에 자동으로 종료되므로, run( ) 메서드의 종료를 유도하는 것이 최선입니다. 이 때, stop이라는 플래그를 ㅇ이용해서 run( ) 메서드의 종료를 유도하게 됩니다. 

 

public class XXXThread extends Thread {
	private boolean stop;	// stop 플래그 필드
    
    public void run() {
    	while ( !stop ) {
        	// 스레드가 반복 실행하는 코드;
        }
        // 스레드가 사용한 자원 정리
    }
}

 

 

위와 같은 예시가 있다고 하면, stop이라는 필드가 false인 동안에는 run( )이 실행됩니다. 만일, stop 필드가 true가 되면 while문의 조건이 false가 되므로 while문을 빠져나오게 되고, 자원 정리 후 run( ) 메서드가 끝나게 됨으로써 스레드는 안전하게 종료되는 것입니다. 

 

 

아래에서 조금 더 구체적인 예제를 살펴보도록 하겠습니다. 

 

// PrintThread1.java
public class PrintThread1 extends Thread {
	private boolean stop;
	
	public void setStop(boolean stop) {
		this.stop = stop;
	}
	
	public void run() {
		while(!stop) {
			System.out.println("실행 중");
		}
		System.out.println("자원 정리");
		System.out.println("실행 종료");
	}
}

 

public class ExampleMain {
	public static void main(String[] args) {
		PrintThread1 printThread = new PrintThread1();
		printThread.start();
		
		try { Thread.sleep(1000); } catch (InterruptedException e) {}
		
		printThread.setStop(true);
	}
}

/* 출력
...
...
실행 중
실행 중
실행 중
실행 중
실행 중
실행 중
실행 중
실행 중
실행 중
실행 중
자원 정리
실행 종료
*/