패턴 명칭
Safe Termination
필요한 상황
스레드의 종료를 안전하게 하기 위한 패턴이다. 스레드는 기본적으로 stop 매서드를 제공하지만, 이 매서드는 안정성 문제로 deprecated 되었다. 스레드는 자신의 코드가 모두 실행되고 종료되는 것이 가장 이상적이지만, 실행 중간에 종료되어야 할 상황에서 안전하게 종료될 수도 있어야 한다.
예제 코드
먼저 수를 계속 카운팅하는 스레드 Worker를 기동시키는 아래의 코드가 있다.
package tstThread;
public class Main {
public static void main(String[] args) {
System.out.println("BEGIN");
Worker worker = new Worker();
worker.start();
try {
Thread.sleep(2000);
System.out.println("[stopRequest BEGIN]");
worker.stopRequest();
System.out.println("[stopRequest END]");
worker.join();
} catch(InterruptedException e) {
//.
}
System.out.println("END");
}
}
Worker 스레드는 다음과 같다.
package tstThread;
public class Worker extends Thread {
private volatile boolean bStop = false;
public void stopRequest() {
bStop = true;
interrupt();
}
public void run() {
try {
for(int i=0; true; i++) {
if(bStop) break;
System.out.println("Counting: " + i);
Thread.sleep(100);
}
} catch(InterruptedException e) {
//.
} finally {
release();
}
}
private void release() {
System.out.println("SAFE TERMINATION");
}
}
bStop 변수가 스레드를 안전하게 종료시키는 장치인데, volatile로 선언되었다. 이 변수는 stopRequest 매서드로 인해 true로 설정되며, interrupt 매서드의 호출을 동반한다. interrupt 매서드의 호출은 wait, sleep로 인해 스레드가 대기하는 상황에서도 안전하게 스레드를 종료시키기 위함이다. 실행 결과는 다음과 같다.
BEGIN Counting: 0 Counting: 1 Counting: 2 Counting: 3 Counting: 4 Counting: 5 Counting: 6 Counting: 7 Counting: 8 Counting: 9 Counting: 10 Counting: 11 Counting: 12 Counting: 13 Counting: 14 Counting: 15 Counting: 16 Counting: 17 Counting: 18 Counting: 19 [stopRequest BEGIN] [stopRequest END] SAFE TERMINATION END
